北邮ACM题

qq_16071447 2017-01-15 05:16:40
90. 字符串转换
时间限制 1000 ms 内存限制 65536 KB
题目描述
我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串。现在给你一个仅由小写字母组成的字符串,你需要用最小的花费,将其转换成一个简单串。 花费的计算规则如下:将a到z这26个小写字母从左到右排成一排,则每个字母都有左右两个邻居,我们认为a的左邻居是z,z的右邻居是a。一个字母只能转换成其相邻的字母,转换的花费为1。一个字母可以进行多次转换,例如将a转换成d,可以进行如下的步骤: a->b->c->d,花费为3。字符串的转换花费为所有字母转换花费之和。例如将字符串"abbbz"转换成简单串的最小花费为3,转换后的结果为"bbbbb"。

输入格式
第一行一个整数T(T≤100),表示测试数据的组数。 每组测试数据只有一行,为仅含小写字母的字符串,字符串长度不超过1000。

输出格式
对于每一组数据,输出一个整数,表示将字符串转换成简单串的最小花费。

输入样例
2
abbba
abbac
输出样例
2
3







#include <stdio.h>
int main(){
int m,n,i,j,count,min;
char a[1008];
scanf("%d\n",&m);
while(m--){
gets(a);
min=9999999;
for(i=0;a[i]!='\0';i++){
count=0;
for(j=0;a[j]!='\0';j++){
if(a[i]>a[j])
count+=(a[i]-a[j])<(a[j]+26-a[i])?(a[i]-a[j]):(a[j]+26-a[i]);
if(a[i]<a[j])
count+=(a[j]-a[i])<(a[i]+26-a[j])?(a[j]-a[i]):(a[i]+26-a[j]);
}
if(min>count)
min=count;
}
printf("%d\n",min);
}
return 0;
}
为什么把gets(a)就是答案错误改成scanf("%s",a)就过了;
...全文
309 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2017-01-16
  • 打赏
  • 举报
回复
gets(a); getchar(); //读取一个字符,把换行符读取掉 你试试这个
幻夢之葉 2017-01-16
  • 打赏
  • 举报
回复
gets(a);不丢弃换行符,所以会导致下一次读不是预期的数据
赵4老师 2017-01-16
  • 打赏
  • 举报
回复
边界条件 输入输出格式 ……
qq_16071447 2017-01-16
  • 打赏
  • 举报
回复
嗯嗯,谢谢各位,这里貌似用gets总是会读入回车
引用 3 楼 cfjtaishan 的回复:

#include <stdio.h>
#include <string.h>

int main()
{
    char a[1008];
    int m, i, j, count, min;

    scanf("%d\n",&m);

    while(m--) {
        fgets(a, 1007, stdin);
        a[strlen(a)-1] = 0;
        min=9999999;
        for(i=0;a[i]!='\0';i++){
            count=0;
            for(j=0;a[j]!='\0';j++){
                if(a[i]>a[j])
                    count+=(a[i]-a[j])<(a[j]+26-a[i])?(a[i]-a[j]):(a[j]+26-a[i]);
                if(a[i]<a[j])
                    count+=(a[j]-a[i])<(a[i]+26-a[j])?(a[j]-a[i]):(a[i]+26-a[j]);
            }
            if(min>count)
                min=count;
        }
        printf("%d\n",min);
    }
    return 0;
}
用fgets替换gets是想把警告去掉;fgets和gets都会将换行符自动加到字符数组倒数第二个位置,最后一个字符是字符串结束标志。 所以,通过a[strlen(a)-1] = 0就是用字符串结束标记覆盖回车符。这样就把字符数组a中的回车符去掉了。
这里还是答案错误了
自信男孩 2017-01-16
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
gets(a); getchar(); //读取一个字符,把换行符读取掉 你试试这个
这种方法是行不通的,因为gets是将回车符加到了字符串数组中成为字符串的一部分,getchar是接收回车符,是改变不了gets将回车符加到字符串中的。 比如输入abbba,在字符串中的存放是: abbba\n\0
自信男孩 2017-01-16
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>

int main()
{
    char a[1008];
    int m, i, j, count, min;

    scanf("%d\n",&m);

    while(m--) {
        fgets(a, 1007, stdin);
        a[strlen(a)-1] = 0;
        min=9999999;
        for(i=0;a[i]!='\0';i++){
            count=0;
            for(j=0;a[j]!='\0';j++){
                if(a[i]>a[j])
                    count+=(a[i]-a[j])<(a[j]+26-a[i])?(a[i]-a[j]):(a[j]+26-a[i]);
                if(a[i]<a[j])
                    count+=(a[j]-a[i])<(a[i]+26-a[j])?(a[j]-a[i]):(a[i]+26-a[j]);
            }
            if(min>count)
                min=count;
        }
        printf("%d\n",min);
    }
    return 0;
}
用fgets替换gets是想把警告去掉;fgets和gets都会将换行符自动加到字符数组倒数第二个位置,最后一个字符是字符串结束标志。 所以,通过a[strlen(a)-1] = 0就是用字符串结束标记覆盖回车符。这样就把字符数组a中的回车符去掉了。
自信男孩 2017-01-16
  • 打赏
  • 举报
回复
引用 7 楼 jianwen0529 的回复:
[quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] gets(a); getchar(); //读取一个字符,把换行符读取掉 你试试这个
这种方法是行不通的,因为gets是将回车符加到了字符串数组中成为字符串的一部分,getchar是接收回车符,是改变不了gets将回车符加到字符串中的。 比如输入abbba,在字符串中的存放是: abbba\n\0[/quote] gets 跟 fgets 是不一样的,buffer中并不会保存换行符 http://www.cplusplus.com/reference/cstdio/gets/?kw=gets[/quote] sorry,是我记错了~
幻夢之葉 2017-01-16
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
[quote=引用 2 楼 jianwen0529 的回复:] gets(a); getchar(); //读取一个字符,把换行符读取掉 你试试这个
这种方法是行不通的,因为gets是将回车符加到了字符串数组中成为字符串的一部分,getchar是接收回车符,是改变不了gets将回车符加到字符串中的。 比如输入abbba,在字符串中的存放是: abbba\n\0[/quote] gets 跟 fgets 是不一样的,buffer中并不会保存换行符 http://www.cplusplus.com/reference/cstdio/gets/?kw=gets

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧