猜数字,又称 bulls_and_cows,是一种古老的的密码破译类游戏。
通常适于两人或多人一起玩。
以两人游戏为例:由一方先设定一个数字,而另一方来猜。
设定数字的人要想好一个没有重复数字的、十进制的四位数(即四数位、十数码、不含重复
数字),且不能让猜的人知道。然后,猜的人就可以开始“猜数字”了。
猜数方每猜一个数字,出数者就要根据对方所猜的数字给出“几 a 几 b”的回应;其中,a
前面的数字表示位置正确的数的个数,而 b 前的数字表示数字正确而位置不对的数的个数。
举例来说——若出数者设定的正确答案为 2358,而猜的人猜 2485,这时的情况,就是 1a2b;
其中,第一个 2 的数字和位置都已经对了,记为 1a,而 5 和 8 这两个数字对了,位置没对,因
此记为 2b。
同理——若出数者设定的正确答案是 1234,而猜的人猜 4321,那结果就是 0a4b,数字全中,
但位置全错。
以此类推……
在猜完一轮后,猜的人可再根据上一次猜测时得到的“几 a 几 b”情况接续推理,直到猜中
正确答案(即 4a0b)为止。
…………
这并不是一个特别复杂的游戏,但它涉及到了记忆、推理、计算和运气等诸多因素,玩起
来……也并没有那么简单。
因此,当主办者说出“猜数字”这三个字后,底下的人也都各自在心里打起了算盘。
而他们的反应,自然也都在主办者的意料之中……
主办者并没有停顿太久,便接着说道:“当然了,不可能是普通的猜数字,因为那太容易了……
无论是采用标准规则(四数位、十数码、不含重复数字),还是 mastermind 规则(四数位、六数
码、含重复数字),只要掌握了正确的解法。七次左右就一定能猜出来,运气好的五次以内就行……”
他顿了顿,“所以……我稍稍提高了难度,改为了——六数位、十数码、含重复数字。”
提示答案换算
H I
0
1
3
6
7
J K L M N O P Q
2
9
8
4
5
switch(keep)
{
case 1:ccc(4,10,0,0);keep=-1;break;
case 2:ccc(4,6,1,2);keep=-1;break;
case 3:ccc(6,10,4,4);keep=-1;break;
case 4:zdy();keep=-1;break;
case 5:keep=-1;break;
default :printf("抱歉,没有这个选项,请重新输入\n\n");keep=0;break;
}
}
}
void zdy()
{
int wei,ma,chong;
printf("请依次输入位数(1~9),进制数(1~10),和是否含重复数字(1、是,0、否)\n(各
数字间用空格或回车隔开)\n");
scanf("%d%d%d",&wei,&ma,&chong);
ccc(wei,ma,chong,6);
}
void ccc(int wei,int ma,int chong,int mod)
{
int t,temp=0,number,i,j,k=0,a,b,ture[wei],cai[wei];
char ch;
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
t=time(NULL);
for(i=0;i
}
}
ture[i]=number;
ch=number+'H';
printf("%c ",ch);
}
putchar('\n');
while(1)
{
scanf("%d",&k);
for(i=wei-1;i>=0;i--)
{
cai[i]=k%10;
k=k/10;
}
for(a=b=j=0;j
void record()
{
printf("\t\t 模式\t\t 次数\t\t 用时\n");
printf("\t\t 模式 1\t\t%d\t\t%d\n",red[0],red[1]);
printf("\t\t 模式 2\t\t%d\t\t%d\n",red[2],red[3]);
printf("\t\t 模式 3\t\t%d\t\t%d\n",red[4],red[5]);
printf("\t\t 自定义\t\t%d\t\t%d\n",red[6],red[7]);
}