猜数字游戏的提示
和书上那个做法不同!!
实现一个经典”猜数字”游戏。 给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)。输入包含多组数据。 每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列。 猜测序列全0时该组数据结束。 n=0时输入结束。
样例输入:
4 1
3 5 5
1 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)
代码如下:(自己纯手打,可复制自己运行)
注释写的有些少。也不是很难懂,自己写了5个多小时写出来的,细节比较多。哪不懂评论,估计看的人也比较少。我就懒得再补注释了。
#include<iostream>
using namespace std;
#include<stdio.h>
#include<string.h>
int a[100000][2];
int c[10000];
int d[10000];
int e[10000];
int max2;
int testValue(int *test,int n){
int sum = 0;
for(int i = 0; i < n ; i++)
if( *(test+i) == 0 )
sum++;
if(sum == n) //输入的全都是0
return 0;
return 1;
}
int testPosition(int *key,int *test,int keyValue,int n){
int z = 0;
for(int i = 0; i < n && z < keyValue; i++)
if(key[i] == test[i]){
c[key[i]]--;
d[key[i]]--;
z++;
}
int sum = 0;
for(int i = 0; i <= max2 ; i++)
if(c[i] > 0 && d[i] > 0)
sum++;
return sum;
}
void maxvalue(int *key,int n){
max2 = key[0];
for(int i = 0 ; i < n ; i++)
if(max2 < key[i])
max2 = key[i];
}
int main(){
int n,Game = 1,count = 0 , k = 0 , sum = 0;
//k组大数据,sum先不用管,一直累加
int group[100000]; //每次测试保存了group[i]组测试数据
memset(group,0,sizeof(group));
while(scanf("%d",&n) == 1){
if(n == 0) break;
memset(e,0,sizeof(e));
int *key = new int[n];
for(int i = 0; i < n ; i++){
scanf("%d",key+i);
e[*(key+i)]++;
}
maxvalue(key,n);
int *test = new int[n];
k++;count = 0; //共有k组大数据,每组里有count行小数据
while(1){
memcpy(c,e,sizeof(e));
memset(d,0,sizeof(d));
for(int i = 0; i < n ; i++)
{scanf("%d",test+i); d[*(test+i)]++; }
if( testValue(test,n) == 0)
break;
count++; //如果能执行到这里,说明该组数据合法
int keyValue = 0;
for(int i = 0; i < n ; i++)
if(key[i] == test[i])
keyValue++;
a[sum][0] = keyValue;
//cout<<"sum = "<<sum <<" a[sum][0] = "<<keyValue;
a[sum][1] = testPosition(key,test,keyValue,n);
//cout<<" a["<<sum<<"][1] = " <<a[sum][1]<<endl;
sum++;
}
group[k] = count;
}
n = k;
k = 1;sum = 0;
while(k <= n){
printf("Game %d:\n",Game++);
for(int i = 0 ; i < group[k] ; i++)
printf(" (%d,%d)\n",a[sum++][0],a[sum][1]);
k++;
}
}