泥巴麒麟的BLOG

          shenAwesome@hotmail.com 縱不能,將醉做生涯,休拘束

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            195 Posts :: 2 Stories :: 80 Comments :: 0 Trackbacks
          古老的題目:2個(gè)水壺, 一個(gè)5升,一個(gè)6升。問(wèn)如何用這2個(gè)測(cè)量出3升水
          一個(gè)面向?qū)ο蟮乃惴ǔ绦蛉缦拢?br />


          結(jié)果如下

          succeeded: fill a, a->b  (0/5),  fill a, a->b  (4/6), drop b, a->b  (0/4),  fill a, a->b  (3/6),
          succeeded: fill a, a->b  (0/5),  fill a, a->b  (4/6), drop b, a->b  (0/4),  fill a, a->b  (3/6), a->b  (3/6),
          succeeded:fill b, b->a (5/1), drop a, b->a (1/0), fill b, b->a (5/2), drop a, b->a (2/0), fill b, b->a (5/3),
          succeeded:fill b, b->a (5/1), drop a, b->a (1/0), fill b, b->a (5/2), drop a, b->a (2/0), fill b, b->a (5/3), b->a (5/3),

          所以是4個(gè)解,這算法就是廣度遍歷,壓棧。

          還有一個(gè)思路,可用逆推
          有用的事實(shí):
            1 如果一個(gè)壺是非空非滿,則另外一個(gè)壺必是空或滿。
            2 空和滿之間轉(zhuǎn)換沒(méi)難度,思考時(shí)可以理解空就是滿
            3 記住3是目的。所以3不能參與運(yùn)算。
          設(shè)5升壺為a,6升壺為b
          則最后的可能

          一 a 有3升
             1. b 0升  則說(shuō)明前一步是 b->a,之前的水是 1/2 或 2/1 對(duì)照上述事實(shí),可見(jiàn)此選擇不可能。
             2. b 6 升 則說(shuō)明前一步是 a->b,之前是  5/4 ,ok, 4 只可能為5-1,6-2,加法全部不可能。得到1則很容易。

          二 b 有3升
              1. a 0  升 則說(shuō)明前一步是 a->b
              2. a 5  升 則說(shuō)明前一步是 b->a

          從純數(shù)學(xué)的角度來(lái)說(shuō)這個(gè)問(wèn)題是如何用有限的數(shù)字組合出最后的數(shù)字。這樣會(huì)大大簡(jiǎn)化程序。
          如果按照逆推的思路,相信也可以寫出算法(感覺(jué)可以用遞歸),而且應(yīng)該速度會(huì)快很多。


          其實(shí)猜出來(lái)很容易,但是要找出統(tǒng)一規(guī)律則有些難度。我本來(lái)以為會(huì)有很多解,但我的算法只算出來(lái)4個(gè),應(yīng)該是準(zhǔn)確的。




          posted on 2008-11-12 06:38 泥巴麒麟 閱讀(106) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 将乐县| 崇明县| 仪陇县| 宁乡县| 莎车县| 循化| 正安县| 大化| 高碑店市| 滁州市| 新疆| 黄冈市| 凤台县| 沁源县| 个旧市| 林甸县| 东阿县| 阳曲县| 德昌县| 通辽市| 加查县| 磴口县| 余江县| 师宗县| 门源| 句容市| 清远市| 米泉市| 古浪县| 沂源县| 大悟县| 石阡县| 象州县| 哈巴河县| 温宿县| 武威市| 龙川县| 琼海市| 讷河市| 曲靖市| 滕州市|