UVa 340 Master-Mind Hints (优化查找&复制数组)(二)
,7)和(5,8)这样不是无关的匹配,不能同时存在于一个匹配集中。
2. 上面第三句话说明计算暗示时,优先计算强匹配的数目。
思路:由于只有9个数字,所以只需要统计每个数字出现的个数即可。
强匹配的数目:相同列相同数字的统计一遍,然后相同列相同数字对应的个数减一。
弱匹配的数目:统计1~9在两序列中出现的个数,每个数字加其再两个序列中出现个数的较小值,详见代码。
完整代码:
/*0.019s*/ #include#include #include using namespace std; int s[1005], g[1005]; int a[15], b[15], c[15]; int main(void) { int cas = 0, n; 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", ++cas); while (true) { memcpy(a, c, sizeof(c));// 技巧:用memcpy将c[]中统计的1-9的数的个数赋给a[] memset(b, 0, sizeof(b)); for (int i = 0; i < n; i++) { scanf("%d", &g[i]); b[g[i]]++; } if (!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; }