文曲星猜数字用c语言编程,文曲星中的猜数字游戏,要猜一个四位数,有什么通用公式?...

匿名用户

1级

2009-03-13 回答

我看到上面都没有给出一个解法,我写了很多,希望你能认真看看,再评价一下.

这个我有研究过,所以很有兴趣写一下:

假设要猜的是6281(用实例来说,随便取,方法是不依赖数字)

第一步:

1234 显示 1A1B

第二步:

3456 显示 0A1B

第三步:

5678 显示 0A2B

第四步:

7890 显示 0A1B

(前四步为固定填法)

第五六步前的准备:

笔算:分成12,34,56,78,90五组进行推理的,求出哪几组有的待求的数字.

从第一步开始,1234,有2个数字(A和B的和),

先假设12没有,则34有两个,根据第二步,出现了矛盾,因为34有两个,但第二步显示只有1个.

假设12有一个,则34有一个,则56没有,78有两个,到第四步,又出现了矛盾,显示只有1个,根据推理,应该有2个

假设12有两个,则34没有,则56有一个,78有一个,没有出现矛盾

结论:即12有两个,56有一个,78有一个若没有出现矛盾,可以认为是对的(假如出现两种假设都没有矛盾的话,增加一个测试9012,则必可以排除,但这又增加了一步,后面的就紧了,所以说我的方法,有缺陷,但能解决大部分问题)

这一步要会出现其他情况,在末尾再说.

第五步:

测试数据1,2,5,0,选0,因为0不可能出现

1,2是确定有的,把它们填在之前没有填过的位置上,如1不要填在第一位,2不要填在第二位

5是待测试的,也不要填在第一位和第三位.

测试:

2105 显示 0A2B

即可以肯定6是有的

第六步:

测试数据1,2,6,7

确定的是1,2,6, 不确定的是 7

同样,数据填在未填过的位置上.

测试:

6712 显示 1A2B

即肯定是1,2,6,8

第七步前的准备:

最后再笔算一下,情况好的话,不需要第7步:

然后写一个矩阵的样子:

1 1 1 1

2 2 2 2

6 6 6 6

8 8 8 8

第几列表示第几位可以填的数字,如第一位可以填1,2,6,8

以下利用前六步结果排除:

7.1.先找出全是A的结果,比如确定1是第一位,则可以把第一列的2,6,8擦去,把第二三四列的1擦去

7.2 但这个例子没有全是A的结果,只好找全是B的了.

7.2.1找到3456 显示 0A1B

故6不可能出现在第4列

划掉:

1 1 1 1

2 2 2 2

6 6 6 x

8 8 8 8

7.2.2再找到 5678 显示 0A2B

故6不可能出现第2列,8不可能出现第4列也擦去

1 1 1 1

2 2 2 2

6 x 6 x

8 8 8 x

7.2.3继续找到7890 显示 0A1B

故8也不能出现在第2列

擦去

1 1 1 1

2 2 2 2

6 x 6 x

8 x 8 x

7.2.4还有最后一个纯净的2105 显示 0A2B

故也擦去第一列的2和第二列的1

1 x 1 1

x 2 2 2

6 x 6 x

8 x 8 x

7.3(然后可以简化一下矩阵,即使不简化也没有所谓,即某一列只剩一个数字,可以把这行的同样数字删去)

x x x 1

x 2 x x

6 x 6 x

8 x 8 x

7.4现在根据上面的矩阵枚举情况了(不允许重复数字)

6281

8261

这次就拿出含有A结果来测试

第一步结果:1234 显示 1A1B

把6182当成真正结果来和1234比对,吻合,有1个A

把8261测试,也吻合

还有一个结果没有用

6712 显示 1A2B

6281测试,也吻合

8261测试,应该有一个1A,但一个没有,不吻合

故最后结果为6281.

第七步:

若还不能判断

则再测试一个,同样,已经填的位置不要填.

最后总结一下;

第四步后的推理,很重要.

通常出现三种情况

1.4个数字分别分散在4个分组中

2.2个数字分散在2个分组中,2个数字在同一分组中(上述例子是这种情况)

3.2个数字在一个组,另外2个数字在另一个组

绝大多数出现第2,3种情况,最好做,一般可以6步解决.

上述解法可以用于第2,3种情况.

下面补充说第1种情况

第1种,有可能弄到要第7步,不过老实说,出现这种情况的概率很小,我估计只有1.58%,

第五步和第六步有可能要调整

第五步,推荐做法,假设待猜为 7316,则经过前四步为12,34,56,78,各有一个数字

前两组各取一个数字,与确定不出现的数字(90)测试

如取1,3,9,0.

若命中两个数字,则确定为 1,3

若命中一个数字,未确定1还是3,

若命中0个数字,则确定为2,4

再取后两组各一个数字,与90测试

5,7,9,0

若命中两个数字,则确定为 5,7

若命中一个数字,未确定5还是7,

若命中0个数字,则确定为6,8

若两次都为确定情况,则可确定4个数字,可按上面第7步前的准备做

若有一次为不确定情况,则可再测试一次(第7次测试),

若两次均为不确定情况,这个,很麻烦,

则可枚举可能情况,按上面的

1.假设是1, 则数字为1,4

假设是3, 则数字为3,2

2.假设是5, 则数字为5,8

假设是7, 则数字为7,6

一共有4种情况

1458

1476

3258

3276

这个,很少见,因为这个概率很小,真的,估计不到1%.

先看看能不能用前面测试的结果(只能拿全为A的或者全为B的排除,就是假设这个是对,拿去比照),若可以,则排除

若还是不行.可以测试1,4,5,8若中4个,或若中0个,则也可以确定4个数字

若中两个,赌一把吧,但这个概率,我估计只有0.79%.

其实最重要弄清楚4个数字是什么,则可以按第七步的准备的方法来排除

推荐不要把相同的数字填在相同的位置两次以上,这是为第七步前的排除做好准备的.

我写这个,当然不是好方法,只为交流一下,更希望高手能有一般方法,毕竟在允许试7次的条件下,我的方法还是有一点不能确定的可能.

若有什么不明白的地方,欢迎交流.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值