真是好久没怎么解题,脑袋都秀逗了。。
这个是个比较有意思的题目,以前文曲星里面有这种游戏“猜数字”
一个人出一定数目的数字,比如说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);
}