UVa 340 - Master-Mind Hints 解题报告 - C语言

1.题目大意

比较给定序列和用户猜想的序列,统计有多少数字位置正确(x),有多少数字在两个序列中都出现过(y)但位置不对。

 

2.思路

这题自己思考的思路跟书上给的思路差不多。第一个小问题——位置正确的数字数量可以很容易求出,第二个小问题——在两个序列中都出现过但位置不对的数字数量则要由“y-x=在两个序列中都出现过的数字数量-位置正确的数字数量”得出。

 

3.应当注意的问题

(1)虽然思路大同小异,但是具体实现的过程中能否很好地实现则很考验人。最开始写这题的时候,我甚至定义了4个数组,这点在后来证明了是没有必要的。因此在实现的过程中,如何简化应该是值得思考和练习的。

(2)对于结束的判断,“正常的猜测序列不会有0,所以只判断第一个数是否为0即可”,其实在判断结束的实现这里我卡了一下,说明对题目的理解还不够。

 

4.代码

#include"stdio.h"
#define maxn 1005

int main()
{
    int n,i,d,x,y,num1,num2,times=0;
    int a[maxn],b[maxn];

    while(scanf("%d",&n)==1 && n)
    {
        printf("Game %d:\n",++times); //数据组数编号
        for(i = 0; i < n; i++)
            scanf("%d",&a[i]);
        for(;;)
        {
            x = 0;
            y = 0;
            for(i = 0; i < n; i++)
            {
                scanf("%d",&b[i]);
                if(a[i] == b[i]) x++;  //统计有多少数字位置正确
            }
            if(b[0] == 0) break;

            for(d = 1; d < 10; d++)
            {
                num1=0;
                num2=0;
                for(i = 0; i<n; i++)
                {
                    if(d == a[i])  num1++;
                    if(d == b[i])  num2++;
                }
                if(num1 < num2) y += num1;
                else y += num2;
            }
            printf("    (%d,%d)\n",x,y-x);
        }
    }
    return 0;
}

  

  参考书目:算法竞赛入门经典(第2版) 刘汝佳 编著

posted @ 2016-10-10 19:29  rgvb178  阅读(1114)  评论(0编辑  收藏  举报