泥巴麒麟的BLOG

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

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            195 Posts :: 2 Stories :: 80 Comments :: 0 Trackbacks
          古老的題目:2個水壺, 一個5升,一個6升。問如何用這2個測量出3升水
          一個面向對象的算法程序如下:



          結果如下

          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個解,這算法就是廣度遍歷,壓棧。

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

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

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

          從純數學的角度來說這個問題是如何用有限的數字組合出最后的數字。這樣會大大簡化程序。
          如果按照逆推的思路,相信也可以寫出算法(感覺可以用遞歸),而且應該速度會快很多。


          其實猜出來很容易,但是要找出統一規律則有些難度。我本來以為會有很多解,但我的算法只算出來4個,應該是準確的。




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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 革吉县| 九寨沟县| 贺兰县| 台东市| 平武县| 红安县| 扶余县| 神池县| 云南省| 蓬安县| 永州市| 东山县| 顺平县| 彩票| 阿克苏市| 湖口县| 远安县| 陈巴尔虎旗| 建水县| 嵊州市| 湟源县| 霍林郭勒市| 延安市| 虎林市| 双柏县| 望都县| 额济纳旗| 七台河市| 红安县| 郸城县| 修文县| 乐山市| 上林县| 漯河市| 通城县| 溧水县| 石嘴山市| 蕉岭县| 南汇区| 云龙县| 常德市|