真是好久没怎么解题,脑袋都秀逗了。。
这个是个比较有意思的题目,以前文曲星里面有这种游戏“猜数字”
一个人出一定数目的数字,比如说1 2 3 4 5
另外一个人猜,知道他不想猜了。
对于每组猜的数字,输出完全猜对的个数和只是数字正确而位置错误的数字。
比如猜1 3 6 7 8
就输出1,1
源码
#define LOCAL #include <stdio.h> #include <string.h> #define MAXN 1000 + 10 int number[MAXN]; int guessNumber[MAXN]; int flags[MAXN]; int amount[10]; void match(int n); int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); #endif int n; int flag; int t = 0; while(scanf("%d", &n) != EOF && n != 0) { // 数据初始化 memset(number, 0, sizeof(number)); memset(guessNumber, 0, sizeof(guessNumber)); flag = false; // 数据输入 printf("Game %d:\n", ++t); for(int i = 0;i < n; i++) { scanf("%d", &number[i]); //printf("%d", number[i]); } //printf("\n"); while(true) { flag = true; for(int i = 0;i < n; i++) { scanf("%d", &guessNumber[i]); //printf("%d", guessNumber[i]); if(guessNumber[i] != 0) { flag = false; } } //printf("\n"); if(flag == true) { break; } // 算法主体 match(n); } } return 0; } void match(int n) { memset(flags, 0, sizeof(flags)); memset(amount, 0, sizeof(amount)); int r = 0; int s = 0; for(int i = 0; i < n; i++) { if(number[i] == guessNumber[i]) { r++; flags[i] = true; } else { amount[number[i]]++; } } for(int i = 0; i < n; i++) { if(flags[i] == false)// 猜测的数字未被使用 { if(amount[guessNumber[i]] > 0) { s++; amount[guessNumber[i]]--; } } } printf(" (%d,%d)\n", r, s); }