uva340-Master-Mind Hints


一.题目描述:

  翻译成中文意思大概是这是一个猜数游戏,第1行是答案序列的长度,也是询问的序列的长度(输入0结束),第2行是答案序列,接下来n行是询问序列,直到输入全0结束,每一个询问你都得给出回答,(x,y),x代表的是输入的序列中的数字与答案序列中的数字有几个是吻合的,y代表输入序列中的数字与答案序列中的数字有几个相同的,但是不在同一位置,也就是不吻合。现在请你编程实现这个功能;

二.解题思路:

参考刘汝佳大佬的紫书后,发现真的秒的解法,同时我也做了一下改进。

首先我们对答案串1-9数字的个数进行统计,然后每次输入都对询问串的数字进行统计,如果询问串上的数字等于答案串该位置上的数字,则ansa+1。再用一个循环统计模式串中1-9的数字,用ansb+答案串和询问串中这个数字的最小值,也就是有效的数字数目。再利用ansb - ansa就可以得到询问串中有答案串中的数字正确但位置不正确的数字个数。非常的巧妙>0

三.代码实现:

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int ans[1010];
 4 int a[10];
 5 int b[10];
 6 int main()
 7 {
 8     int n;
 9     int turns = 1;      
10     while(cin >> n){
11         if(n == 0) break;
12         cout << "Game " << turns++ << ":" << endl;
13         memset(a,0,sizeof(a));
14         for(int i = 0;i < n;i++){
15             cin >> ans[i];
16             a[ans[i]]++;
17         }
18         while(1){
19             int input;
20             int ansa,ansb;
21             int zero = 0;
22             ansa = ansb = 0;
23             memset(b,0,sizeof(b));
24             for(int i = 0;i < n;i++){
25                 cin >> input;
26                 if(input == 0) zero++;
27                 if(ans[i] == input) {ansa++;}
28                 b[input]++;
29             }
30             if(zero == n) break;
31             for(int i = 1;i <= 9;i++)
32                 ansb += min(a[i],b[i]);
33             cout << "    (" << ansa <<  "," << ansb - ansa << ")" << endl;
34         }
35     }
36     return 0;   
37 }
UVa