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

评论