实现一个经典"猜数字"游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确
(A),有多少数字在两个序列都出现过但位置不对(B)。
输入包含多组数据。每组输入第一行为序列长度n,第二行是答案序列,接下来是若干
猜测序列。猜测序列全0时该组数据结束。n=0时输入结束。
样例输入:
4
1 3 5 51 1 2 3
4 3 3 5
6 5 5 1
6 1 3 5
1 3 5 5
0 0 0 0
10
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
1 1 2 2 3 3 4 4 5 5
1 2 1 3 1 5 1 6 1 9
1 2 2 5 5 5 6 6 6 7
0 0 0 0 0 0 0 0 0 0
0
样例输出:
Game 1:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)
Game 2:
(2,4)(3,2)
(5,0)
(7,0)
思路:对比每一位是否相同,相同则 sum1++
因为要轮流比较出现的相同数字,不如求出1~9每个数字出现的次数,存在以该数字为下标的数组(N[ ] Z[ ])中,然后比较样例数字出现的次数,将共同出现的次数(也就是min(N[i]), Z[i])全部存在 sum2 中
假如全部猜错则次数为 sum2次
猜对的次数为 sum1 次
所以实际猜错的次数为 sum2 - sum1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int Nnum[10], Znum[10];//存1~9每个数字出现的次数
int N[1005], Z[1005];
int minn(int a, int b){//返回同一个数字出现最少的次数(共同出现的次数)
if(a == 0 || b == 0)return 0;
return a > b ? b : a;
}
int main(){
int n;
int sum1, sum2;
int cnt = 0;
while(scanf("%d", &n) == 1 && n){
sum1 = sum2 = 0;
memset(Nnum, 0, sizeof(Nnum));
for(int i = 1; i <= n; i++){
scanf("%d", &N[i]);
Nnum[N[i]]++;
}
printf("Game %d:\n", ++cnt);
while(1){
sum2 = 0;
sum1 = 0;
memset(Znum, 0, sizeof(Znum));
for(int i = 1; i <= n; i++){
scanf("%d", &Z[i]);
Znum[Z[i]]++;
if(Z[i] == N[i])sum1++;//猜对的次数
}
if(!Z[1]) break;
for(int i = 1; i <= 9; i++){
sum2 += minn(Nnum[i],Znum[i]);//猜错的次数
}
printf(" (%d,%d)\n", sum1, sum2-sum1);
}
}
return 0;
}