• 【趣味数学】可以说谎的猜数字游戏


      又是一年找工作的高峰期,各种各样千奇百怪的智力题也在考验着学子们的智商,其中有些题目更是让人脑细胞大量死亡。。。近来有同学问一道,带有说谎的猜数字游戏,问“元芳,这事你怎么看?”,我这想一口盐汽水喷死他。好了,言归正传。

    问题描述:

      A,B两名玩家首先约定正整数N,然后A在心里想一个正整数x,其中x在1和N之间,B通过提问来猜出A心中所想的数字x。B提问的格式只有一种:先列出一些数字,然后问“x”是否在这些数字中(当然B也可问:x是否在某个区间内),B可以提问任意多次,A可回答“是”或者“否”。A可以偶尔撒谎的,但是A不能连续两次撒谎。问:B是否可以通过询问得到A心中的所想的数字,或者给出一个集合保证A所想数字x必定落在次区间内,如果能请给出策略;如果不能请说明理由。

    问题解答:

      乍一看这个问题确实比较棘手,不知道从何开始,再次情况下,先求解简单的特殊情况,然后逐步归纳得到一般地结论,是一个不错的选择。因而我们可以从最简单的情况考虑,假设N=2,那么A所想的数字要么是1要么2.这种情况下如何呢?

      由于A不可能连续说谎,所以如果对于同一个问题连续问两次,A两次给出相同的答案,那么我们是可以猜出答案的。比如:B连续两次提问“x=2吗?”,A如果给出答案“是是”,那么A两次必然都说真话,所以x=2;如果A回答“否否”,那么两次“否”也是真话,因而断定x不等于2,x=1。

      然而A给出不能的答案,B连续两次提问”x=2吗?“,A回答“是否”,我们只能断定有一次说了假话,不能断定哪一次说了假话,因而得不到任何有用的信息。在此基础上,如果再问“x=1吗?”,A可以根据上次说真话还是假话来给出回答,如果上次说的假话,那么只要保证这次说的是真话就可以了,但是我们并不知道他是否正在说真话,因而还是得不到有用的信息;如果上次说的真话,那么这次真话假话都可以,就可以随便答,如果继续逼问”x=1吗?“,A上次说”是“,这次就说”否“,上次说”否“,这次就说”是“,我们是无论如何都不可能知道他什么时候在撒谎的。因而如果只有两个值,那么B是不可能通过提问来猜出x的。

    上面的过程可以通过下面这个简单的例子看出,假设x=2。

    (1)”x=2吗?“  ”是“  ”x=2吗?“  "否"  ”x=2吗?“  ”是“。。。(交替回答即可)。。。。”x=1吗?“  ”是/否“(上次说真话,这次随便) ”x=1吗?“  ”否/是“ 

    (2)"x=2吗?"   "否"   ”x=2吗?“  ”是“  ”x=2吗?“  ”否“。。。。(交替回答即可)。。。”x=1吗?“  ”否“(上次说假,这次必须说真)  ”x=1吗?“  ”是“

    因为1和2是称的,如果接着问”x=2吗?“,只需要把上述(1)(2)中回答1和2的策略交换即可。

    ----------------------------------------------------------------------------我是分割线---------------------------------------------------------------------

      N=2是不能断定的,那么N=3情况会是怎么样的呢?A只能想123中的某一个数。同样根据A不能连续说谎两次,我们可以对一个问题重复问2次以上,如果A的回答是相同的,那么必然是可以得到信息的。

    例如连续问”x=3吗?“,A的回答方式只可能是”是是“ ”否否“”是否“”否是“这四种情况。

    (1)如果A回答”是是“,立刻断定两次都为真话,因而x=3.

    (2)如果A回答”否否“,立刻断定两次都为真话,因而x不等于3,可排除3.

    (3)如果A回答”否是“,继续问”x=2吗?”  A只能回答“是/否”,分情况讨论:(3a)如果A回答“是”。也就是“x=3吗?”“是”“x=2吗?”“是”。由于两者中至少有一真,有不可能都是真(x不能即等于2也等于3),所以两者中必有一真一假。这样可以得出x要么等于2要么等于3,因而可以排除1。(3b)如果A回答是“否”,也就是“x=3吗?”“是”“x=2吗?”“否”。这时如果x=2,那么可以得出他两次都说假话。因而可以得出x不等于2,即可以排除2.

    (4)如果A回答“是否”,继续问“x=3吗?”,如果回答“否”,按情况(2)处理,如果回答“是”,按情况(3)处理。

      因而通过上面的提问策略我们总是可以排除其中的一个数,在大多数情况下不能得到更多的信息,除了情况(1)可直接得到答案。

    ----------------------------------------------------------------------------我是分割线-------------------------------------------------------------------------

      现在我们开始考虑原始问题,如果N比较大怎么办呢?我们可以把N分成三等分(不一定要求相等,尽量即可),这样把上面的策略中的123,换成集合123即可,比如“x在第三个集合中吗?”,这样的话,我们每次可以淘汰1/3的所有数字,直到最终剩下两个数字,就归结为第一个小问题,不可能得到确定的某一个数字。

      本来讨论到这里已经结束了,但是有同学说,其实这个问题Matrix67已经有讨论过,并且还有更一般的结论,有兴趣的同学请点击这里

     

     <注>博主python27对本博客文章享有版权,转载请注明出处,对解题思路有任何建议,欢迎在评论中告知。

  • 相关阅读:
    如何设置'REUSE_ALV_GRID_DISPLAY'的单个单元格的颜色
    ABAP绘图功能模块概观(转)
    [数据库基础]——编码标准之编码注意事项(持续更新)
    ABAP--关于ABAP流程处理的一些命令的说明(stop,exit,return,check,reject)
    ABAP中的Table Control编程
    ABAP中的数据校验-备注
    ABAP 一个隐藏 selection-screen block的实例
    ABAP语言常用的系统字段及函数
    ABAP中的同步和异步调用
    FOR ALL ENTRIES IN 与 INNER JOIN 写在一个SQL上影响效率
  • 原文地址:https://www.cnblogs.com/python27/p/2727810.html
Copyright © 2020-2023  润新知