正文

对置顶贴猜数字的一点解释.2006-07-26 12:35:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/elva6401/16842.html

分享到:

·  评论人:廿定角   时间:2006-7-25 22:37:00   前几篇就这个看的懂。哈哈   看来有必要解释一下: 要电脑猜中你想的数字,首先电脑会先猜你想的4个数字是什么(先不管顺序)。思路是先猜0 1 2 3 4这5个数字有几个数字包含在你想的数字中,comp(int a,int b,int c,int d)这个函数的返回值是a,b,c,d有几个数是你想的数。comp(guess[0],guess[1],guess[2],guess[3])情况相当,分情况考虑,等于0,4这就不说了。这来说一下等1,2,3的情况:假如等于1吧 则0,1,2,3可以写成 A,X,X,X(A表示是你想的数字,X则不是)用数字4分别代替0,1,2,3可能可以得到2种情况: 1).假如4是你想的数字即为A,则代入4有:            Comp函数的结果 A X X X          x[2]=1 A A X X          x[3]=2 A X A X          x[4]=2 A X X A          x[5]=2 x[2]+x[3]+x[4]+x[5]>4*x[1] 用这个就可以判断数字4是你想的数字,在反过去判断0,1,2,3是否是你想的数字。。 2).假如4不是你想的数字即为X,代入4有:              Comp函数的结果 X X X X          x[2]=0 A X X X          x[3]=1 A X X X          x[4]=1 A X X X          x[5]=1 x[2]+x[3]+x[4]+x[5]<4*x[1] 用这个就可以判断数字4不是是你想的数字,在反过去判断0,1,2,3是否是你想的数字。。   同样的道理来判断5 6 7 8 9 测试顺序的时候则用一个比较笨的办法,穷举法(数组s[24]就是这个用处)。   欢迎看的懂朋友提出更快的猜算方法。我这个方法可以猜,但是很笨,AI不高。平均要20几步才可以猜出结果。要是能在10步内猜出就好了。   附1:测试数据(假设你想的数字是0 1 4 6)。 0 1 2 3 2a0b 0 1 2 4 2a1b 4 1 2 3 1a1b 0 4 2 3 1a1b 0 1 4 3 3a0b 5 6 7 8 0a1b 5 6 7 9 0a1b 9 6 7 8 0a1b 5 9 7 8 0a0b 5 6 9 8 0a1b 0 1 4 6 4a0b I get it,it is:0 1 4 6     附2:最终整理的代码。 #include <iostream.h> #include <string.h>   int s[24]={     1234,1243,1324,1342,1432,1423,     2134,2143,2314,2341,2431,2413,     3214,3241,3124,3142,3412,3421,     4231,4213,4321,4312,4132,4123};   int comp(int a,int b,int c,int d) {     char s[5];     cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;     cin>>s;     return s[0]-'0'+s[2]-'0'; }   int comp2(int a,int b,int c,int d) {     char s[5];     cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;     cin>>s;     if(s[0]-'0'!=4)//顺序还没有完全对     return 0;     else     return 1; }      int main() {     int i,j;     int guess[10];     int num[10];     int total=0;     int mydate[4];     int x1,x2,x3,x4,x5,x6;        int x[6];       for(i=0;i<10;i++)        num[i]=0;     for(i=0;i<10;i++)        guess[i]=i;       x[1]=comp(guess[0],guess[1],guess[2],guess[3]);        x[5]=comp(guess[0],guess[1],guess[2],guess[4]);     if(x[1]==0)     {        if(x[5]!=0)        {            num[4]=1;            total++;        }     }     else if(x[1]==4)     {        num[0]=1;        num[1]=1;        num[2]=1;        num[3]=1;        total+=4;        goto loop;     }     else     {        x[2]=comp(guess[4],guess[1],guess[2],guess[3]);        x[3]=comp(guess[0],guess[4],guess[2],guess[3]);        x[4]=comp(guess[0],guess[1],guess[4],guess[3]);        if(x[2]+x[3]+x[4]+x[5]>4*x[1])         {            num[4]=1;            total+=1;                  for(i=2;i<=5;i++)                  if(x[1]==x[i])                  {                             num[i-2]=1;                             total++;                  }        }        else        {                  for(i=2;i<=5;i++)               if(x[1]>x[i])                  {                         num[i-2]=1;                         total++;                  }        }     }        if(total==4)  goto loop;       //0,1,2,3,4已经确定是否出现。       x[1]=comp(guess[5],guess[6],guess[7],guess[8]);        x[5]=comp(guess[5],guess[6],guess[7],guess[9]);     if(x[1]==0)     {        if(x[5]!=0)        {            num[9]=1;            total++;                  if(total==4)                          goto loop;        }     }     else if(x[1]==4)     {        num[5]=1;        num[6]=1;        num[7]=1;        num[8]=1;        total+=4;        goto loop;     }     else     {        x[2]=comp(guess[9],guess[6],guess[7],guess[8]);        x[3]=comp(guess[5],guess[9],guess[7],guess[8]);        x[4]=comp(guess[5],guess[6],guess[9],guess[8]);        if(x[2]+x[3]+x[4]+x[5]>4*x[1])        {            num[9]=1;            total+=1;                  for(i=2;i<=5;i++)                  if(x[1]==x[i])                  {                         num[i+3]=1;                         total++;                  }        }        else        {                  for(i=2;i<=5;i++)                  if(x[1]>x[i])                  {                         num[i+3]=1;                         total++;                  }        }     }     loop:     j=0;     for(i=0;i<10;i++)     if(num[i]==1)     {        mydate[j]=i;        j++;     }        i=0;        while(1)        {            x1=s[i]/1000-1;            x2=s[i]/100%10-1;            x3=s[i]/10%10-1;            x4=s[i]%10-1;            if(comp2(mydate[x1],mydate[x2],mydate[x3],mydate[x4])==1)            {               cout<<"I get it,it is:";               cout<<mydate[x1]<<" "<<mydate[x2]<<" "               <<mydate[x3]<<" "<<mydate[x4]<<endl;               return 0;            }            i+=1;        } }    

阅读(12608) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册