实现一个经典“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(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)
源代码:
#include <iostream>
using namespace std;
int main()
{
int n,sum=0;
while(cin>>n &&n) //当n不等于0时输入
{
sum++;
cout<<"Game"<<" "<<sum<<":"<<endl;
int* a=new int[n+1];
int* b=new int[n+1];
for(int x=1;x<=n;x++)
cin>>a[x];
for(;;) //无限循环,可以这么写,因为有条件:当b[0]=0跳出
{
int A=0,B=0;
for(int y=1;y<=n;y++)
{
cin>>b[y];
if(a[y]==b[y]) //边输入边判断,简洁
A++;
}
if(b[1]==0) //break可以跳出一个for
break;
for(int z=1;z<=9;z++)
{
int c1=0,c2=0,tmp;
for(int m=1;m<=n;m++)
{
if(a[m]==z)
c1++;
if(b[m]==z)
c2++;
}
if(c1<=c2)
tmp=c1;
else
tmp=c2;
B=B+tmp;
}
cout<<"("<<A<<","<<B-A<<")"<<endl;
}
}
return 0;
}
这个题目的主要问题是求B,按数学的思想,把答案序列和猜测序列对同一个数字,出现的次数最少的挑出来,这个数字最少的,减去对于这个数字相同的次数,就是这个数字的B。求出所有1-9中,在答案序列和猜测序列中出现的最小次数之和,减A就是B。