`
美丽的小岛
  • 浏览: 309297 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

01虫子问题<转>

阅读更多

来自:http://www.cs.cmu.edu/puzzle/puzzle37.html

http://www.matrix67.com/blog/archives/5063

题目


      

       有一条虫子,它的整个身体由 n 节构成,每一节要么是有瑕疵的 1 ,要么是没有瑕疵的 0 ,因而整个虫子的身体结构就可以用一个 n 位 01 串来表示。你的目标是把整个虫子变成 000...00 的完美形式。每一次,你可以砍掉虫子最右侧的一节,同时虫子会在最左侧长出新的一节,以保持虫子的总长度不变。如果你砍掉的是一个 1 ,那么你可以指定虫子在最左侧长出的是 1 还是 0 ;但如果你砍掉的是一个 0 ,那么你无法控制虫子会在最左侧长出什么——它可能会长出 0 ,也可能会长出 1 ,因而你不得不假定,概率总是会和你做对,上天会竭尽全力地阻挠你。我们的问题是:不管虫子的初始状态是什么,你总能保证在有限步之内让虫子变成 000...00 吗?

      注意,这个问题可能没有你想的那么简单。显然,我们必须得把一些 1 变成 0 ,这样才能让 1 的数目逐渐减少并最终消失。但是,如果只是简单地每次都把 1 变成 0 ,最终也不见得就一定能取胜。比如,如果这条虫子是 101 ,那么去掉最右边的 1 并选择在左边长出一个 0 ,虫子会变成 010 ;再把 010 右边的 0 去掉后,如果不巧左边长出的是 1 ,那么整条虫子又会回到 101 的状态。如此反复,将永远也不能得到 000 。而更加聪明的方法则是先把 101 变成 110 ,下一步虫子将会变成 111 或者 011 ,不管是哪种情况,接下来只需要逐个把 1 变成 0 就能获胜了。运用恰当的策略才能走到终点,这无疑让问题变得更加有趣。

    不管虫子一开始是什么样子的,我们总能够在有限步之内获胜。下面是 Peter Winkler 给出的证明。让我们把连续 n 次操作视为一轮操作,因而完成一轮操作正好让虫子的整个身体更新一次。于是,每一轮操作实际上相当于是从右到左依次考虑虫子的每一位,每遇到一个 1 时你都可以选择是否把它修改成 0 ,每遇到一个 0 时它都会随机地被修改成 1 。我们一轮一轮地改造虫子的身体,并且每一轮都采取这样的策略:从最右端开始,每次遇到 1 都把它改成 0 ,直到第一次有 0 被改成 1 ;在此之后,不管新遇到的 0 变没变,都保留所有的 1 不变。如果这一轮下来后,没有 0 被改成 1 ,那么我们将会把所有的 1 都替换成 0 ,从而得到 000...00 的形式,直接获得胜利;如果途中有 0 被改成了 1 ,那么整个虫子作为一个二进制数将会严格增加。每经过一轮后,只要虫子没有变成 000...00 ,整个二进制数都会变得更大,最终将会变成 111...11 的形式,此时再也不会有 0 变成 1 了,于是按照我们的策略,在下一轮中,所有的 1 都会变成 0 ,从而获得胜利。

  • 大小: 45.9 KB
分享到:
评论

相关推荐

    IDEA中安装junit并调试文章中对应jar包

    &lt;version&gt;5.8.2&lt;/version&gt; &lt;!-- 或者使用其他版本 --&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; ``` 如果是Gradle项目,添加以下行: ```groovy testImplementation 'junit:junit:5.8.2' // 使用相应版本 ``` 3....

    HTML+JS实现一个百战天虫类页面游戏

    这通常涉及使用`&lt;div&gt;`、`&lt;canvas&gt;`或`&lt;svg&gt;`标签来创建游戏画布,以及使用`&lt;button&gt;`、`&lt;label&gt;`等元素来提供用户交互。 JavaScript是实现游戏动态行为的关键。我们可以利用JavaScript事件监听器来响应用户的键盘...

    C_NOIP_Knowledge_19-20课时(阶段测试).pdf

    #include &lt;iostream&gt; using namespace std; int main() { char ch; cin &gt;&gt; ch; if ((ch & 1) == 1) { cout &lt;&lt; "YES" &lt;&lt; endl; } else { cout &lt;&lt; "NO" &lt;&lt; endl; } return 0; } ``` 2. **期末考试 (qimo.cpp...

    E-Debug虫子修复.rar_E-Debug虫子修复_e-bug虫子修复_e-debug 使用_虫子修复工具_虫子修复版

    E-Debug虫子修复工具就是专门设计用来定位并修复这些错误的工具,它可以帮助开发者更有效地诊断和解决软件中出现的问题。 E-Debug工具的核心功能在于其强大的事件分析能力。在描述中提到的“按钮事件”,是指用户在...

    E-Debug虫子修复工具

    总的来说,"E-Debug虫子修复工具"凭借其强大的反汇编能力和全面的调试功能,为易语言开发者提供了一把利器,使得他们能够在面对程序问题时更加得心应手。无论是初学者还是经验丰富的程序员,都应该熟练掌握这款工具...

    HTML5 Canvas小虫子游动特效.zip

    1. **创建Canvas元素**:HTML5中,我们用`&lt;canvas&gt;`标签在页面上创建一个画布,然后通过JavaScript获取到它的2D渲染上下文(`canvas.getContext('2d')`)以便进行绘图操作。 2. **绘制路径**:虫子的身体可能由多个...

    苹果与虫子2.docx

    这个问题是NOI(全国青少年信息学奥林匹克竞赛)中的一道题目,被称为“苹果与虫子2”。这是一道基础的数学问题,主要涉及到整数除法和取余运算,以及条件判断的应用。以下是对该问题的详细分析: 首先,我们需要...

    C#虫子吃苹果小游戏代码

    【C#虫子吃苹果小游戏代码】是一款基于C#编程语言和MonoGame框架开发的横版游戏。MonoGame是一个开源的跨平台游戏开发框架,它允许开发者使用C#编写游戏,然后在多个操作系统上发布,如Windows、MacOS、Linux以及...

    安卓,苹果,APP开发验证专用TOKEN.zip.zip

    苹果APP,安卓APP,后端接口调用通用TOKEN安全验证,在开发中APP没有后台,数据都是通过JSON数据进行互动的,在网上公开调用JSON数据很不安全,所以产生了TOKEN验证,此验证大大增加了接口调用的安全性。...

    E-Debug虫子修复

    E-Debug虫子修复

    养殖虫子网站

    这包括在元标签(如`&lt;meta&gt;`标签)中设置标题、描述、关键词,以及在页面内容中自然地嵌入关键词,提高网站在搜索结果中的排名。 此外,网站可能还运用了响应式设计,确保在不同设备(如手机、平板、电脑)上都能...

    算法-苹果和虫子(信息学奥赛一本通-T1038)(包含源程序).rar

    标题中的“苹果和虫子”是一道典型的算法问题,常见于信息学竞赛中,例如NOIP(全国青少年信息学奥林匹克联赛)或者IOI(国际信息学奥林匹克)。这道题目通常涉及数据结构和算法的运用,旨在考验参赛者的编程思维和...

    捉虫子flash游戏

    【捉虫子Flash游戏】是一款非常适合编程初学者的互动学习工具。它利用了Flash平台的易用性和互动性,让玩家在游戏中了解编程基础,特别是针对初级程序员或对编程感兴趣的用户,提供了一个寓教于乐的环境。在这款游戏...

    1038 虫子和苹果.cpp

    1038:苹果和虫子 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 70115 通过数: 19748 【题目描述】 你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个...

    Java游戏熊猫坐虫子

    《Java游戏:熊猫坐虫子》 在编程领域,尤其是游戏开发中,Java语言因其跨平台性和丰富的库支持,成为了许多开发者的选择。本项目“Java游戏:熊猫坐虫子”便是一个以Java编写的趣味小游戏,它展示了如何利用Java...

    HTML5青蛙吃苍蝇小游戏代码下载

    此外,HTML5的`&lt;canvas&gt;`标签是关键,它是一个画布,允许通过JavaScript动态绘制图形和动画,这在游戏中用于显示青蛙和苍蝇的移动。 2. **JavaScript**:游戏的逻辑和交互主要由JavaScript实现。JavaScript代码可能...

    用友NC凭证导入XML中文说明

    &lt;ufinterface account="develop" billtype="vouchergl" businessunitcode="develop" filename="" groupcode="" isexchange="" orgcode="" receiver="0001121000000000JIYO" replace="" roottag="" sender="001"&gt; ...

    AniLib:AniLib是AniList.co的强大功能,是AnimeManga跟踪应用程序。 跟踪和浏览您所有的Weeby Collection等

    anilist_client_id=&lt;here&gt; anilist_client_secret=&lt;here&gt; 会费 始终创建对dev分支的拉取请求。 发送拉取请求之前,请拉到最新状态,以避免合并冲突。 创建有关其功能或解决方案的描述。 问题 在创建问题之前,请...

    CSS3虫虫旋转Loading加载特效.zip

    此外,HTML文件(如index.html)通常包含了虫子加载图标的基本结构,可能是一个`&lt;div&gt;`或其他元素,通过CSS类选择器与CSS样式关联。`说明.htm`和`说明.txt`可能是包含特效使用方法和注意事项的文档,帮助开发者理解...

    C语言实现简易扫雷游戏

    本文实例为大家分享了C语言实现简易扫雷游戏的具体代码,供大家参考,具体内容如下 扫雷 楔子: 扫雷游戏是我们小时候无聊时消磨时间的小玩意,...#include &lt;stdio&gt; #include &lt;stdlib&gt; //定义方格大小 #define MAX_ROW 10

Global site tag (gtag.js) - Google Analytics