猜数字游戏的策略
先说个简单点的。
第一步,猜0001,2223,4445,6667,8889。可以判断是那四个数字,比如1,3,5,0。
第二步,选择一个没有出现的数字,比如9,结合前四个中的一个,判断其位置。
比如1999,9199,9919可以判断1(前三个都不是第四个,下同)。
第二个数需要两次,第三个数需要一次,剩下的就是最后一个。
这样最差的情况只需要11次,有点多。最大的好处就是不需要动脑子。
对上述策略的改进
第二步,以0001的形式输入0和1两个确定的数字。有如下三种情况:
1A3B,0和1一定不在第四位(因为“1A”一定是0,如果是1,那么0一定在前三位,会有2A,所以1不在第四位,也是因为“1A”是0。),这样剩下的两个数中一定有一个在第四位,剩下的两个数,比如2和3,以2232的形式输入。如果3是第三位,则显示2A2B,否则显示4B,这样三位、四位、两位就结算了。再猜一次,就能确定一、二、二位数的顺序,肯定能猜对九次。
2A2B,1一定是第四位,0一定不是第四位。
4B,0一定是第四个,1一定不是第四个。
以上两种情况是等价的,第一次就可以确定一个数的位置。假设第四位是1,下次猜0021,结果可能是3A1B,那么结果就是0321或者3021,只需要再猜一次。或者2A2B,两个零一定有一个是对的,2一定是错的,所以第三位一定是3,结果是2031或者0231,你只需要再猜一次;或者1A3B,那么0一定在第三位,结果是2301或者3201,仍然只需要再猜一次。
综上所述,在这个策略下,最坏的情况需要9次。
为了进一步提高效率,需要综合每次的结果。这种情况太多了,它就失去了作为战略的意义。
研究这个问题真的很有意思。以下是我的想法,不一定能解决问题,但可能会启发别人。我的主要研究是<最坏情况下至少有几个猜测,策略是什么?& gt
第一步,因为所有数字都一样,我第一次输入0123,现在轮到提问者了。我相信没有人会给他A,最多B,但是给他几个B合理吗?
下一次猜测B的期望。E=4*4/6=8/3。
1B,E=1*1/4+3*3/6=7/4
2B,E=2*2/4+2*2/6=5/3
3B,E = 3 * 3/4+1 * 1/6 = 29/12
4B,E=4作为提问者,我希望对手猜B的期望值最小,所以我选择给他2B。
第二步,输入4501,又轮到提问者了。现在问题变得复杂了。
我觉得4501可以分为45和01两部分,其中45是新的,按照上面的方法继续做。
0B,E = 2 * 2/4 = 1;
1B,E = 1 * 1/2+1 * 1/4 = 3/4;
2B,E = 2 * 2/2 = 2;所以提问者会在45中给出1B。
其实复杂的部分是01,因为涉及到A部分,我只能假设提问者只有在不得不给出A的情况下才给出A,如果是意料之中的,我已经很困惑了,所以我就简化一下,我觉得这个假设不一定不合理。从给B,我们也可以遵循开始的想法
0B,E=2*2/2=2
1B,E = 1 * 1/2+1 * 1/2 = 1
2B,E=2*2/2=2
所以01会给出一个b,现在提问者知道0中的1,1;2和3中的一个;4,五分之一;6,7,8,9各有一个。综上,第二步,提问者给的是0A2B。
第三步,提问者聪明一点。不要从四组中分出四个数,至少可以确定三个数。但我们认为,作为提问者,如果你在6、7、8、9中一次猜中一个数字,他一定会将最后一次猜中的数字设为正确,以增加你的猜对次数,也就是说,即使你从现在开始猜,
在提问者不能给A的前提下,理性的提问者应该给,0A1B,为什么不给0B给1B?如果给了0B,那么提问者就知道前三组数中的1,3,5一定是对的,除了A优于3B,其他地方没有优势。在确定A时,1B比2B更有优势(提问者更难猜到),这对于提问者来说很麻烦,因为他不知道1B是哪个,这个答案几乎对确定B没有贡献,所以提问者不应该给出这些数字。如果只有1的数出现在前三组,那么不仅可以唯一确定这个数所属的组。
现在总猜情况是0123,4501,所以第三步是6078。
问题越来越复杂了。对于0,可以给B也可以不给,对于6,7,8,可以给B也可以不给。0B,1,9肯定是B;2B,1肯定是B,6,7,8之间肯定有B,但是如果给1B,就需要猜这个B是哪里来的,增加了猜的难度,所以提问者给0A1B。
第四步:现在总的猜测情况是0123,4501,6078。和之前一样分析完了,我受不了了,就说一下我的猜测策略。第四步:7890。
如果第三步B为0,那么提问者应该给出答案1A1B。
(按照这个假设,总的猜测情况是0123,4501,6078,7890。现在我们知道0的位置已经确定,9确定为b .第五步:9240。如果9的位置是对的,那么如果给2A0B,结果一定是9350。如果给2A65438。如果9的位置不对,相信两步就能解决。)只考虑这种情况,提问者可以把你的步骤限制在至少7步。
如果在第三步中,B是6,7,8中的一个,那么0肯定不是B,1肯定是B,提问者只需要考虑B是在7,8还是6中。很明显,提问者会在7,8中做出B,所以给出的答案是0A1B。总的猜测情况是065433。
第五步:8215,提问者0A2B。
第六步:5381,提问者
1A0B = = = & gt;2741,
1A2B = = = & gt;3751,5731
2a 1B = = = & gt;3481
3A0B = = = & gt4381.只有这四种情况是因为之前的限制。结果也需要7个步骤。
我不保证我已经严格证明了一切,但是作为一个解题者,我的感觉是我可以用更少的步骤解决这个问题(虽然我不知道我能不能少做一点)。如果有人能少走几步就解决了,我就拜了,但如果是七步以上,我就不答应了。我完全处于解题者的位置,这也是猜测者思维最难的假设。
有什么高明的想法欢迎指正~
如果你想玩,可以用我的QuickBasic程序。
随机化定时器随机化
Cls的清晰屏幕
Dim a(4),b(4)'定义数组。
10a = int(RND * 9000)+1000 '得出一个数。
Aa = a '体双变量
A$ = Mid$(Str$(a),2)'删除前导空格。
对于i = 4到1步-1 '这种循环截断。
a(i) = a模10
a = a \ 10
然后
对于i = 1到3 '这个循环确定是否有重复的数字。
对于j = i + 1到4
如果a(i) = a(j)那么10 '如果有重复的数字,复制它们。
下一个j,我
对于I = 10到1步-1 '有十次机会。
s = 0“A”次清除。
v = 0“B”次清除。
还有多少机会可以打印?
20输入“输入a号”,b '输入你的号码。
如果b = 0则打印“答案是”;Aa:如果直接回车显示答案,游戏同时结束。
对于j = 4到1步-1 '截断
b(j) = b mod 10
b = b \ 10
然后
对于j = 1到3
对于k = j + 1到4
如果b(j) = b(k)那么20 '如果有重复的数字,重新输入。
下一个k,j
对于j = 1到4
如果a(j) = b(j)那么s = s+1 '如果满足条件,“a”加1。
然后
对于j = 1到4 '求“b”的个数
B $ = mid $ (str $ (b (j)),2)'去掉第一个“0”。
Z = Instr(a$,b$)'在你的数字中找到相同的数字。
如果z & lt& gt0和a(z)& lt;& gtB(z)然后v = v+1 '找到“b”
数量
然后
如果s = 4,则打印“你是对的!”:End '如果“a”= 4表示没事,结束游戏。
打印s;“一”;五;“B”打印“A”和“B”的号码
然后
打印“对不起,你输了!”没猜到,结束。
结束
如果没有QB,去www.iteroom.cn下载
谢谢你