题意:题目看起来有点难,特别是看到choose、max的时候,其实认真看完,就是对比两行,相同位置元素相同,则是强匹配;否则,元素相同,而位置不同,则是弱匹配。
思想:强匹配,过一遍,对比相应位置,相同则+1,即可;弱匹配,它是要把之前的强匹配过的不进行匹配的,而且一个元素只能弱匹配成功一次,即一个元素匹配成功一次后不再匹配。这里我用的是指示数组,在弱匹配时,查找该bool数组,如果已经访问过,即匹配过(为1),则跳过。我觉得这里其实也可以把匹配成功过的元素修改为其他数字,比如0,但是要对secret进行副本的复制、即要保留原来值,比如这里用char数组存,然后strcpy拷贝副本进行处理。好吧,理解了这个题的意思后,这个题就基本水题了,可做的方法就很多了~
注意:就是在计算弱匹配的时候,怎样修改指示数组,以及continue和break的地方。
自己要注意的:int型数组a, scanf("%d",&a[i]); 数组名是地址,但具体数组的一个元素时,它是int型的,所以还要&.
Code:
#include<stdio.h>
#include<string.h>
#define MAXN 1010
int sct[MAXN];
int gus[MAXN];
bool s[MAXN];
bool g[MAXN];
int main()
{
int n;
int i=0;//Game数
while((scanf("%d",&n)==1) && n)
{//一次Game
i++;
printf("Game %d:\n",i);
for(int i=0;i<n;++i)
scanf("%d",&sct[i]);//数组名是地址,但具体每个元素,还是int型,所以要用&。写的时候也犹豫了
bool flag=1;
while(flag)
{//一次guess
memset(s,0,sizeof(s));
memset(g,0,sizeof(g));
for(int i=0;i<n;++i)
{
scanf("%d",&gus[i]);
if(gus[i]==0) flag=0;
}
if(flag==0) continue;//其实相当于break;
//计算强匹配数
int strm=0;
for(int i=0;i<n;++i)
{
if(gus[i]==sct[i])
{
strm++;
s[i]=g[i]=1;
}
}
//计算弱匹配数
int wekm=0;
for(int i=0;i<n;++i)
{
if(s[i]) continue;//该位置已访问过,即属于强匹配
for(int j=0;j<n;++j)
{
if(g[j]) continue;
if(sct[i]==gus[j])
{ wekm++; g[j]=1; break;}//注意break,匹配到一个之后就不再重复匹配
}
}//for
//输出
printf(" (%d,%d)\n",strm,wekm);
}//while_flag
}//while
return 0;
}