链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=276
code
#include<stdio.h>
#define maxn 1010
int main()
{
int n ,a[maxn],b[maxn];
int gameCase = 1;
while(scanf("%d",&n) == 1 && n)
{
printf("Game %d:\n",gameCase++);
for(int i = 0; i < n ; i ++) scanf("%d",&a[i]);
while(true)
{
int A = 0, B = 0;
for(int i = 0 ; i < n ; i ++)
{
scanf("%d",&b[i]);
if(b[i] == a[i]) A++;
}
if(!b[0]) break;
for(int d = 1 ; d <= 9 ; d ++)
{
int c1 = 0, c2 = 0;
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;
}
注意事项是先统计在两个序列位置正确的个数A,再统计对于每个数字都有贡献的B,c1,c2是在两个序列中数字1~9出现的次数,min(c1,c2)则是对于B的贡献。最后减去公共部分A,则得到出现但是位置不对的次数