Oct 22

灵魂守恒定律 不指定

felix021 @ 2010-10-22 23:54 [IT » 程序设计] 评论(2) , 引用(0) , 阅读(7409) | Via 本站原创 | |
一切都是从,那道蚂蚁题,开始的
那题中的蚂蚁有20只,爬在长的木棒一根
左边蚂蚁10只向右爬
右边蚂蚁10只向左爬
蚂蚁爬的速度都相同
一碰头各自原速调头
然后就问,这些个蚂蚁,要碰多少次头才会从木棒上都掉下去

一说起这个问题,可能很多人有看过编程之美4.7 蚂蚁爬杆的问题:有一根27厘米长的细长木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置 处各有一只蚂蚁。木杆很细,不能同时通过2只蚂蚁。开始时候,蚂蚁的头朝左还是朝右是任意的,他们只会朝前走或者掉头,但是不会后退。当任意2只蚂蚁碰头后时,2只蚂蚁会同时掉转头朝反方向走。架设蚂蚁每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最短时间和最长时间。

留一些空间不剧透,有兴趣的同学可以先想想然后再往下看。















两只蚂蚁碰头的时候,既然只是各自掉头且速度不变,那么可以认为,在不严格区分两只蚂蚁(比如要求具体某只蚂蚁的运动路径)时,两只蚂蚁只是擦肩而过,继续往前走。在编程之美4.7中,通过这种假设来分析,既然每一只蚂蚁都是继续向前走,那么离运动方向端点最近的蚂蚁耗时最短,反之最长。

回到最初的喷头次数问题上,其实问题的切入点已经在标题中给出了(这个名字是Jieyu想出来的,借用一下,嗯):"灵魂守恒"。对于任意一只蚂蚁,不假设每只蚂蚁在碰头的时候继续往前走,只是假设在每次喷头时两只蚂蚁交换了"灵魂",于是向左的灵魂继续向左,向右的灵魂继续向右(这并不影响碰头的次数)。于是每一只蚂蚁的灵魂都是不断向前的,那么每只向右的蚂蚁的灵魂在向前爬的时候,都会遇到10只向左的蚂蚁的灵魂,进行10次交换,由于灵魂和身体一一对应(灵魂守恒),每个灵魂交换的次数,也就是所有蚂蚁碰头的次数。所以最后的答案是10×10。

这个证明不太严谨。如果使用继续向前走的方式,就可以用很严格的数学来进行证明。我们甚至可以推广到m只向右n只向左的情况,结论是m*n次碰头。证明过程么——数学归纳法。

在1:1 (1只向左,1只向右)的情况下,很显然结果是 1次 = 1 × 1。
假设1:k (1只向左,k只向右)的情况下,需要碰头 k次 = 1 × k。
那么当n = k + 1的时候,很容易通过1:k推广到1:(k+1)的情况,证明需要 (1 × k) + 1 = 1 × (k + 1) = k + 1次
再假设当 x : n 的时候,需要 x * n次
那么当m = x + 1时,可以通过 x:n的情况推广到(x+1):n的情况,证明需要 (x × n) + n = (x + 1) × n次
所以m:n的情况下需要m * n次。



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
sunny Homepage
2010-10-26 02:16
fear  哇,灰常有意思
Me999 Email Homepage
2010-10-24 21:45
哦!原来是这样的情况,灵魂这个词用的高。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]