//给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)
//输入有多组测试。每组输入第一行为序列长度n,第二行是答案序列,接下来是多行猜测序列猜测序列全0该组数据结束。n=0时结束输入
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int compare(int number,int keycopy[],int length)
{
for(int i=0;i<length;i++)
if(number==keycopy[i]){
keycopy[i]=0;//对应过的不能再用
return 1;
}
return 0;
}
int main()
{
int n;
int *key;//正确
int *guess;//猜测
int *keycopy;//复制一遍key
int count1=0,count2=0;
int times=0;
while(scanf("%d",&n)&&n){
printf("Game %d:\n",++times);
int flag=1;
key=(int *)malloc(sizeof(int)*n);
guess=(int *)malloc(sizeof(int)*n);
keycopy=(int *)malloc(sizeof(int)*n);
for(int i=0;i<=n-1;i++)
scanf("%d",&key[i]);
while(flag){//flag为1才说明上次输入不是全零
flag=0;
count1=count2=0;
memcpy(keycopy,key,sizeof(int)*n);
for(int i=0;i<=n-1;i++){
scanf("%d",&guess[i]);
if(guess[i]!=0)
flag=1;
if(guess[i]==key[i]){
count1++;
guess[i]=0;//对应过的不能再用 由题意,key和guess均无0
keycopy[i]=0;//对应过的不能再用
}
}
for(int i=0;i<=n-1;i++)
if(guess[i]&&compare(guess[i],keycopy,n))
count2++;
if(flag)
printf(" (%d,%d)\n",count1,count2);
}
}
return 0;
}
/*
// UVa340 Master-Mind Hints
// Rujia Liu
//直接统计A,为了求B,对于每个数字0~9,统计二者出现的次数c1和c2,min(c1,c2)就是该数字对B的贡献,最后要减去A的部分
#include<stdio.h>
#define maxn 1000 + 10
int main() {
int n, a[maxn], b[maxn];
int kase = 0;
while(scanf("%d", &n) == 1 && n) { // n=0时输入结束
printf("Game %d:\n", ++kase);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(;;) {
int A = 0, B = 0;
for(int i = 0; i < n; i++) {
scanf("%d", &b[i]);
if(a[i] == b[i]) A++;
}
if(b[0] == 0) break; // 正常的猜测序列不会有0,所以只判断第一个数是否为0即可
for(int d = 1; d <= 9; d++) {
int c1 = 0, c2 = 0; // 统计数字d在答案序列和猜测序列中各出现多少次
for(int i = 0; i < n; i++) {
if(a[i] == d) c1++;
if(b[i] == d) c2++;
}
if(c1 < c2) B += c1; else B += c2;
}
printf(" (%d,%d)\n", A, B-A);
}
}
return 0;
}
*/
UVa 340 Master-Minds Hints(猜数字游戏的提示)
最新推荐文章于 2023-01-04 17:03:55 发布