D - Master-Mind Hints

think:
1题意先给出一个数字N代表之后每次输入的元素个数,每组输入数据的第一行代表目标集合,从第二行开始代表每次输入N个猜测元素与目标集合进行判断,1>判断同一下标对应的元素相等的个数(A),2>判断有多少个元素在两个集合中都出现过但是位置不对(B)
2借鉴紫书:直接统计可得A,为了求B,对于每个数字(1~9),统计两者出现的次数c1和c2,则min(c1, c2)就是该数字对B的贡献。最后要减去A的部分

vjudge题目链接

以下为Accepted代码

#include 

using namespace std;

int main()
{
    int n, i, j, k, a[1004], b[1004], c1, c2, x, y;
    k = 0;
    while(scanf("%d", &n) != EOF && n != 0)
    {
        printf("Game %d:\n", ++k);
        for(i = 0; i < n; i++)
            scanf("%d", &a[i]);
        while(1)
        {
            x = y = 0;
            for(i = 0; i < n; i++)
            {
                scanf("%d", &b[i]);
                if(b[i] == a[i])
                    x++;
            }

            if(b[0] == 0)
                break;

            for(i = 1; i <= 9; i++)
            {
                c1 = c2 = 0;
                for(j = 0; j < n; j++)
                {
                    if(a[j] == i)
                        c1++;
                    if(b[j] == i)
                        c2++;
                }
                y += min(c1, c2);
            }
            printf("    (%d,%d)\n", x, y-x);
        }
    }
    return 0;
}

你可能感兴趣的:(D - Master-Mind Hints)