淘先锋技术网

首页 1 2 3 4 5 6 7

实现一个经典"猜数字"游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确
(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;
}