正文

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

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

分享到:

·  评论人:廿定角   时间:2006-7-25 22:37:00

 

前几篇就这个看的懂。哈哈

 

看来有必要解释一下:

要电脑猜中你想的数字,首先电脑会先猜你想的4个数字是什么(先不管顺序)。思路是先猜0 1 2 3 45个数字有几个数字包含在你想的数字中,comp(int a,int b,int c,int d)这个函数的返回值是a,b,c,d有几个数是你想的数。comp(guess[0],guess[1],guess[2],guess[3])情况相当,分情况考虑,等于04这就不说了。这来说一下等123的情况:假如等于1

0,1,2,3可以写成 A,X,X,XA表示是你想的数字,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;

       }

}

 

 

阅读(4101) | 评论(0)


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

评论

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