UVA 340 - Master-Mind Hints
这道题英文描述太冗余。最后看了有个小哥一句话描述的题意才明白了http://blog.163.com/kakarrot@yeah/blog/static/12011592520106241155854/。其实就是统计两个序列相同列相同数字的个数和不同列相同数字的个数。要注意,两列中任意一个元素如果已经用过就不能再用了。
由于只有9个数字,所以只需要统计每个数字出现的个数即可。先把相同列相同数字的统计一遍,即相同列相同数字对应的个数减一。然后统计9个数字在两序列中出现的个数,每个数字加其再两个序列中出现个数的较小值。看代码后就知道啦,很简单。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define min(a, b) ((a) < (b) ? (a) : (b)) int main() { int s[1005], g[1005], n; int a[15], b[15], c[15]; int count = 1; while (scanf("%d", &n) && n) { memset(c, 0, sizeof (c)); for (int i=0; i<n; i++) { scanf("%d", &s[i]); c[s[i]]++; } printf("Game %d:\n", count++); while (1) { memcpy(a, c, sizeof (c)); // 将code中统计的1-9的数的个数赋给a数组 memset(b, 0, sizeof (b)); for (int i=0; i<n; i++) { scanf("%d", &g[i]); b[g[i]]++; } if (0 == g[0]) break; int x = 0, y = 0; for (int i=0; i<n; i++) if (s[i] == g[i]) { a[s[i]]--; b[s[i]]--; x++; } for (int i=1; i<=9; i++) y += min(a[i], b[i]); printf(" (%d,%d)\n", x, y); } } return 0; }