例题3-6 环状序列 UVa1584

算法竞赛入门经典(第2版)第3章 数组和字符串
例题3-6 环状序列 UVa1584
感悟。
1、这次学乖了,直接看英文原题的输入输出样例,在题意理解要求上省了许多力。

2、程序编写,渐入佳境,有些感觉,先写输入输出格式,再写核心算法,在软磨硬泡中,时常会来神来之笔。

3、程序编写,渐渐脱离《啊哈!算法》设置标签(book[1000+10])的影响。

4、不断修改代码的过程中,还能保持一颗平常心,不骄不糙,心性的修炼又上了一个台阶。

5、第一次在UVa上报Runtime error,暂无从下手。
6、静态检查代码(人工重读代码),发现确实数组越界,count=0从while循环体外初始化 转移到 while循环体内初始化count=0就好了。WA
7、总算找到,还是静态检查代码,char min;改成char minc;int mini;两种形式。WA

8、代码无论怎么改,还是WA,暂停,待牛人指点。

9、终于AC了,感谢http://blog.csdn.net/mobius_strip/article/details/49923519给我的启发。

10、读者肯定想不到,只做一处修改if(strcmp(stemp[mini],stemp[i])==1)改成if(strcmp(stemp[mini],stemp[i])>0),这是怎么回事,大牛们能给解释吗?

11、经过一番学习,明白了,不同编译器给出的strcmp("ABC","abc");值是不同的,都通用的,就三种>0,==0,<0。下次小心了,strcmp系列函数。

12、至此困扰7.21一晚,7.22一上午的问题解决。


附上WA代码,经一处修改,已经AC

环境Dev-cpp4.9.9.2

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


const int maxn=100+10;
char s[maxn];
char stemp[maxn][maxn];


int main(){
    int T;
    int len;
    int i;
    char minc;
    int mini;
    int count;
    int j;
    scanf("%d",&T);
    while(T--){
        scanf("%s",s);
        len=strlen(s);
        minc=s[0];
        count=0;
        for(i=0;i<len;i++){//找出字典序列最小的字母 
            if(minc>s[i])
                minc=s[i];
        }
        for(i=0;i<len;i++)
            if(minc==s[i]){//根据最小字母,形成不同子串 
                for(j=0;j<len;j++){
                    stemp[count][j]=s[(i+j)%len];
                }
                stemp[count][j]='\0';
                count++;
            }
        mini=0;
        for(i=0;i<count;i++){//在不同子串中,寻找字典序列最小的串 
            //if(strcmp(stemp[mini],stemp[i])==0)//WA
            if(strcmp(stemp[mini],stemp[i])>0)//AC
                mini=i;
        }
        printf("%s\n",stemp[mini]);
    }
    return 0;
}


附上书中AC代码

环境Dev-cpp4.9.9.2

#include <stdio.h>
#include <string.h>
const int maxn = 100+10;
char s[maxn];
int less(const char *s,int p,int q){
    int i;
    int len=strlen(s);
    for(i=0;i<len;i++){
        if(s[(p+i)%len]!=s[(q+i)%len])
            return s[(p+i)%len]<s[(q+i)%len];
    }
    return 0;
}
int main(){
    int T;
    int i;
    int ans;
    int len;
    scanf("%d",&T);
    while(T--){
        ans=0;
        scanf("%s",s);
        len=strlen(s);
        for(i=0;i<len;i++){
            if(less(s,i,ans)){
                ans=i;
            }
        }
        for(i=0;i<len;i++)
            putchar(s[(ans+i)%len]);
        putchar('\n');
    }
    return 0;
}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值