(引用题意):输入整数N(每行代码长度);输入有多组数据,当n=0时表示结束;而在每组中,以最后输n个0结束。对于每组数据,第一行编码为出题者的(S1,S2,...,Sn),接下来的为猜测者的编码(g1,g2,g3,...gn)。若Si=gj并且i=j,你将得到个A;若Si=gj但i≠j,你将得到B。程序先从1找到n找能得到多少A,然后在找能得到多少B。注意:对于每个Si,gj只能使用一次。然后输出A,B的个数以(X,Y)形式。(X个A,Y个B)。
我的代码:
#include<iostream>
using namespace std;int main()
{
const int maxn=1002; //每行最大长度
int secret[maxn]; //秘密代码
int guess[maxn]; //猜想
int temp[maxn]; //秘密代码副本
int N; //每行数字个数
int strong, weak; //猜对的两种状态
int count; //用来判断读入整行0
int game = 0; //第几次游戏
while(cin>>N && N)
{
game++;
cout<<"Game "<<game<<":"<<endl;
for(int i = 0; i < N; i++)
cin>>secret[i]; //秘密代码
while(1)
{
//初始化
count = 0;
strong = 0;
weak = 0;
for(int a = 0; a < N; a++)
{
cin>>guess[a]; //猜想
if(guess[a] == 0)
{
count++;
}
}
//判断是否整行全为0
if(count == N)
break;
for(int k = 0; k < N; k++) //创建秘密代码副本
temp[k] = secret[k];
//判断同列
for(int j = 0; j < N; j++)
{
if(guess[j] == temp[j]) //同列
{
//以下两行表示已经使用过
temp[j] = 0;
guess[j] = -1;
strong++;
}
}
//判断不同列
for(int m = 0; m < N; m++)
{
for(int n = 0; n < N; n++)
{
if(guess[m] == temp[n])
{
weak++;
temp[n] = 0;
break; //关键居然是这个问题。唯一性(只能用一次)
}
}
}
cout<<" "<<"("<<strong<<","<<weak<<")"<<endl;
}
}
return 0;
}