例题3-4 猜数字游戏的提示 UVa340

来源:互联网 发布:java微信网页开发教程 编辑:程序博客网 时间:2024/04/25 11:54
算法竞赛入门经典(第2版)第3章 数组和字符串
例题3-4 猜数字游戏的提示 UVa340
感悟。

1、自认为这个程序写得还可以。

2、开始阶段一团浆糊,只能从数据的输入输出入手,先整理好输入输出格式。

3、进行输入输出测试阶段,输入太繁琐,果断改成采用文件的方式(FILE *fin)输入数据,测试成功,提交时,再改成标准输入。

4、程序是每当输出结果不符要求,调试,输出结果还不符要求,继续调试,一步一步弄出来的。

5、《啊哈!算法》设置标签(book[1000+10])的算法深入骨髓。

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

7、抽空按原书代码方式敲了一遍,发现原书的输出格式比想象的要简单太多,这样的输出格式,照样AC。

4
Game 1:
1 3 5 5
1 1 2 3
    (1,1)
4 3 3 5
    (2,0)
6 5 5 1
    (1,2)
6 1 3 5
    (1,2)
1 3 5 5
    (4,0)
0 0 0 0
10
Game 2:
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
    (2,4)


附上代码:

环境Dev-cpp4.9.9.2

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


int a[1000+10];//答案序列 
int b[1000+10];//猜测序列 
int ab[1000+10];//a数组对应标签 
int bb[1000+10];//b数组对应标签 
int lcount[1000+10];//统计数字位置正确 
int rcount[1000+10];//统计位置不对的数字 
int main(){
    int n;
    int i;
    int sum;
    int count;
    int game=0;
    int j;
    while(scanf("%d",&n)==1&&n){
        game++;
        count=0;//序列个数 
        memset(lcount,0,sizeof(lcount));//初始化为0 
        memset(rcount,0,sizeof(rcount));//初始化为0 
        for(i=0;i<n;i++){//答案序列 
            scanf("%d",&a[i]);
        }
        while(1){
            sum=0;
            memset(ab,0,sizeof(ab));//每行输入时,标记初始化 
            memset(bb,0,sizeof(bb));//每行输入时,标记初始化 
            for(i=0;i<n;i++){//lcount;
                scanf("%d",&b[i]);
                if(ab[i]==0&&bb[i]==0&&a[i]==b[i]){//位置对应数字处理,同时标记为1 
                    ab[i]=1;
                    bb[i]=1;
                    lcount[count]++;
                }
                sum+=b[i];
            }
            for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                    if(ab[i]==0&&bb[j]==0&&a[i]==b[j]){//位置不对应数字处理,同时标记为1 
                        bb[j]=2;
                        rcount[count]++;
                        break;//找到相同数字,立即跳出,进入下一个数字的查找。 
                    }
                }
            }
            if(sum==0)//跳出序列输入 
                break;
            count++;
            
        }
        printf("Game %d:\n",game);//打印 
        for(i=0;i<count;i++)
            printf("    (%d,%d)\n",lcount[i],rcount[i]);
        
    }
    return 0;
}

0 0