求解 猜数字游戏

alibill 2002-11-04 10:00:23
不知道大家有没有玩过文曲星的“猜数字”游戏。
就是让你去猜四个互不相同的数字。你最多只有七次机
会。每猜一次你可以得到的反馈是:
假如某位的数字猜中了而且位置也是正确的就得到
一个A,如果数字猜对了可是位置不对就得到一个B,例
如正确答案是1234,当你猜4321就可以得到4B,如果猜
1243就可以得到2A2B,当得到4个A时便完全猜中了。

你能编程求出解法吗?(人想数字,机器解)
...全文
469 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AZOK24 2002-11-04
  • 打赏
  • 举报
回复
我才学完C,想学C++,但不知道自己C学得么样,请教大虾,能否出个问题来考考我, 完成一个什么样的任务才算学得差不多,还不错,或马马虎虎。27736218
lazio_qiu 2002-11-04
  • 打赏
  • 举报
回复
我有一个这样的软件(不是我编的)你要吗?
qq:24892027
zhi_chong 2002-11-04
  • 打赏
  • 举报
回复
让我想一想。
alibill 2002-11-04
  • 打赏
  • 举报
回复
我觉得楼上的兄弟理解错了,我的意思是:

我现在想一个数字,比如1980,计算机随机给出一个数字,比如1804。
这时,我输入1A2B,那么计算机就会再给出一个数字,我再提示它。
只有7次机会,直到计算机解出我所想的数字。

其实说白了,就是把文曲星里的猜数字做人机调换,计算机来猜数字。
mrbeaver 2002-11-04
  • 打赏
  • 举报
回复
不会又是作业吧?
下面是一种解法,忘了是谁的了,反正不是我的,你参考一下吧,
希望作者不要骂我……
/******************* file.h *********************/
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>

/******************* singal const define *******************/
# define GUESS_TIME8
# define NUMBER_FLOW0xFFFF

/******************* variable structure define *************/
typedef unsigned int NUMBER;
typedef unsigned char AB;
typedef struct{ NUMBER X; AB ab; }RECORD;
typedef struct{ char i; RECORD R[GUESS_TIME]; }DATA_BASE;

/******************* & function define *********************/
# define break_number(x,X)\
(x)[0]=(X)>>12;\
(x)[1]=((X)>>8)&0xF;\
(x)[2]=((X)>>4)&0xF;\
(x)[3]=(X)&0xF
# define mix_number(x) ((x[0]<<12)|(x[1]<<8)|(x[2]<<4)|x[3])
# define count(E,X,L)\
(E)[0][(X)>>12]++;\
(E)[1][((X)>>8)&0xF]++;\
(E)[2][((X)>>4)&0xF]++;\
(E)[3][(X)&0xF]++;\
(L)++
# define number_chance(c,X)\
(c[0][(X)>>12]*c[1][((X)>>8)&0xF]*c[2][((X)>>4)&0xF]*c[3][(X)&0xF])

/******************* function next_number() ***************/
NUMBER next_number(NUMBER X)
{
char x[4];

break_number(x,X);
for(;
{
if((++x[3])>0x9){ x[3]=0;
if((++x[2])>0x9){ x[2]=0;
if((++x[1])>0x9){ x[1]=0;
if((++x[0])>0x9) return NUMBER_FLOW;
}
}
}
if(x[0]==x[1]||x[0]==x[2]||x[0]==x[3]) continue;
if(x[1]==x[2]||x[1]==x[3]) continue;
if(x[2]==x[3]) continue;
break;
}

return mix_number(x);
}

/******************* function comp() **********************/
AB comp(NUMBER X1, NUMBER X2)
{
char x1[4],x2[4],m,n;
AB a=0,b=0;

break_number(x1,X1);
break_number(x2,X2);
for(m=0;m<4;m++)
for(n=0;n<4;n++)
if(x1[m]==x2[n])
if(m==n) a++; else b++;
return ((a<<4)|b);
}

/******************* function guess() ********************/
NUMBER guess(DATA_BASE d)
{
static NUMBER number_start=0x0123;
static NUMBER number_end=0x9876;
NUMBER number, number_possible, number_best;
int E[4][10]={0};
int length=0;
float digit_chance[4][10];
float chance, chance_best;
char m,n;

if(d.i==0) return 0x0123;

for(;
{
for(m=0;m<d.i;m++)
if(comp(number_start,d.R[m].X) != d.R[m].ab) break;
if(m==d.i) break;
number_start=next_number(number_start);
if(number_start==NUMBER_FLOW) return NUMBER_FLOW;
}
count(E,number_start,length);
number=next_number(number_start);
number_possible=number_start;
while(number<=number_end)
{
for(m=0;m<d.i;m++)
if(comp(number,d.R[m].X) != d.R[m].ab) break;
if(m==d.i)
{
number_possible=number;
count(E,number_possible,length);
}
number=next_number(number);
}
number_end=number_possible;

for(m=0;m<4;m++)
for(n=0;n<10;n++)
digit_chance[m][n]=(float)E[m][n]/length;
number_best=number_start;
chance_best=number_chance(digit_chance,number_best);
number=next_number(number_start);
while(number<=number_end)
{
for(m=0;m<d.i;m++)
if(comp(number,d.R[m].X) != d.R[m].ab) break;
if(m==d.i)
{
chance=number_chance(digit_chance,number);
if(chance>chance_best)
{
number_best=number;
chance_best=chance;
}
}
number=next_number(number);
}
return number_best;
}

/********************* function is_currect_number() *****************/
char is_currect_number(NUMBER X)
{
char x[4];

break_number(x,X);
if(x[0]==x[1]||x[0]==x[2]||x[0]==x[3]) return 0;
if(x[1]==x[2]||x[1]==x[3]) return 0;
if(x[2]==x[3]) return 0;
return 1;
}

/********************* function main() *********************/
int main(int argn, char **argv)
{
NUMBER X;
DATA_BASE d;

if(argn==1)
{
printf("give your number:");
scanf("%x",&X);
}
else
{
X=atoi(argv[1]);
X=(((X/1000)%10)<<12)|(((X/100)%10)<<8)|(((X/10)%10)<<4)|(X%10);
}

if(is_currect_number(X)==0)
{
printf("your number is incurrect");
exit(0);
}

d.i=0;
while(d.i<GUESS_TIME)
{
d.R[d.i].X=guess(d);
d.R[d.i].ab=comp(X,d.R[d.i].X);
if(d.R[d.i].X>0x1000)
printf("%x %xA%xB\n",d.R[d.i].X,d.R[d.i].ab>>4,d.R[d.i].ab&0xF);
else
printf("0%x %xA%xb\n",d.R[d.i].X,d.R[d.i].ab>>4,d.R[d.i].ab&0xF);
if(d.R[d.i].ab==0x40)
{
printf("win <%d>",d.i+1);
exit(0);
}
d.i++;
}
printf("lose");
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧