求猜数字游戏的策略

猜数字游戏介绍:
电脑随机产生一个数字不重复的四位数。电脑会将您提交的数与它自动产生的数进行比较,结果显示成"*A*B"。A代表位置正确数字也正确,B代表数字正确但位置不正确,比如:"2A2B"表示您有2个数字的位置正确且数值也正确,除此以外,您还猜对了2个数字,但位置不对。

问:在最坏情况下最少几次猜中,策略如何?

另外,如果是二人游戏,即一人猜,一人给出*A*B,且数字可以变动(但必须符合先前给出的*A*B),问出题人采用怎样的策略能让对手不易猜中

貌似两个问题等价 =。=
不管了,答得好有加分
请给出详细的严谨的策略和分析,谢谢

请8楼给出具体策略

to9楼:我需要完整的严谨的最佳策略,无论多烦,只求最佳,并且请你注意审题

第1个回答  2017-08-30
#include <stdio.h>
#include <stdlib.h>
#define M 4 //猜几个数字
//交换
void swap(int*a,int*b)
{
int t=*a;
*a=*b;
*b=t;
}
//将数组随机打乱
void random_shuffle(int* a,int n)
{
int i;
for(i=0;i<n;i++)
{
int x=rand()%n;
int y=rand()%n;
if(x!=y) swap(a+x,a+y);
}
}
//生成数位不重复的M位全部数据,存在数组a中,并打乱,备用
int gen(int* a)
{
int count=0,i,j;
int max=1;
for(i=0;i<M;++i,max*=10);
for(i=0;i<max;++i)
{
_Bool flag[10]={0};
int t=i;
for(j=0;j<M;++j)
if(flag[t%10]) break;
else flag[t%10]=1,t/=10;
if(j==M)
a[count++]=i;
}
random_shuffle(a,count);
return count;
}
void test(int answer,int player,int* A,int* B)
{
int i=0,j;
int answer_a[M]={0},player_a[M]={0};
*A=*B=0;

while(answer||player)
{
answer_a[i]=answer%10;
player_a[i++]=player%10;
answer/=10;
player/=10;
}
for(i=0;i<M;++i)
for(j=0;j<M;++j)
if(player_a[i]==answer_a[j])
if(i==j) ++*A;
else ++*B;

}
//参数AB是上一轮猜测的反馈,
//如果得到猜中的信息表示下一把的开始
int guess(int A,int B)
{

int x;
scanf("%d",&x);
return x;
}
int main()
{
srand(2);
int i;
//初始生成数据
int len;
for(len=1,i=0;i<M;++i)
len*=10-i;
int a[len];
gen(a);
//开玩
int n=1;//玩n把
int count=0;//总猜测次数
while(n--)
{
//每把从猜中开始,例如玩4个数,4A0B为猜中,
//此时进入下一把,会有新的数供猜测
//printf("%d\n",a[n]);
int A=M,B=0;
int count_cur=0;
do
{
int player=guess(A,B);
++count_cur;
test(a[n],player,&A,&B);
printf("%d:%0*d,%dA%dB\n",count_cur,M,player,A,B);
}while(A!=M||B);
count+=count_cur;
}
return 0;
}
第2个回答  2007-09-07
第一次最好输入1234,那样之后就不会乱判断了。
最多是猜8次。
第3个回答  2007-09-06
策略很复杂,但是据我实际经验,8次以内肯定能猜到,文曲星电子词典上就是8次,我从来没输过
第4个回答  2007-09-06
这个游戏和电脑玩的话,它一般只给你10次机会.
最坏的情况是在10次内猜不出来的
第5个回答  2007-09-07
反正我的 文曲星上面的猜数字就没有失败过
最坏情况10次也可以出来
相似回答