· 评论人:廿定角 时间: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;
}
}
评论