您的位置:首页 > 其它

UVa 340 猜数字游戏的提示

2014-03-10 23:42 302 查看
题意:题目看起来有点难,特别是看到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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: