淺談「窮舉法」
陳偉康
香港教育學院數學與資訊科技學系
說到以窮舉法來解決數學問題,大家都會感到既麻煩、複雜,又相當 費時。但事實上,在解決很多日常生活中的(數學)問題時,窮舉法可能是最 簡單,又或者是唯一的方法。當然,我們日常使用窮舉法,都只能解決一 些規模較小的問題,在一些規模相對較大的問題時,我們則要使用電腦協 助計算。而有效運用窮舉法,就是學生必須掌握的解難策略。
在本文章中,我將透過兩個大家熟悉的問題,跟大家探討窮舉法的使 用。
問題一:過河問題
圖片源自 http://www.plastelina.net/game1.html
以上是一個大家很可能玩過的遊戲,船夫每次只能把狼、羊或菜送到 對岸,但當人不在時,羊會把菜吃光,狼又會把羊吃掉。這遊戲是要求玩 家控制船夫,把狼、羊及菜都安全送抵對岸。回答這個問題分兩個層次,
第一,能否完成任務?第二,若能夠,如何以最少的來回次數完成?
岸 A 岸 B
(1) 以 A 及 B 表示兩岸,圖的左為岸 A、右邊為岸 B。首先考慮船夫在岸 A 時,岸 B 可能出現的情況(見圖一)。
圖一
因岸上有狼、羊及菜,本應共有八個不同的狀態,但若船夫不在場時,
首三個狀態是不可能出現的,故此,這些狀態可以剔除。同樣地,當 船夫在岸B 時,岸 A 也只可出現相同的五個狀態。
(2) 我們把該十個狀態繪畫在圖二中,並以直線把「彼鄰」的狀態連接。(即 船夫從岸A (B) 划船到岸 B (A) 一次,其中的一個狀態便轉換到另一 個狀態。)例如:狼在岸A,船夫、羊及菜在岸 B;船夫運菜到岸 A,
岸B 只剩下羊;這時,岸 A 的狼(狀態四)與岸 B 的羊(狀態三)稱 為彼鄰,兩者以直線連接。結果,我們可繪出下圖:
圖二
(3) 剩下來的就是從岸 A 的狀態五(即船夫、狼、羊及菜都在岸 B),以最 少的划船次數,移至岸B 的狀態五(即船夫、狼、羊及菜都在岸 A)。
完成這個步驟,我們需要運用『圖論』中尋找最短距離的算法,這個 算法便用上窮舉的概念;簡單來說,就是把所有可能性羅列出來。下 表展示整個運算過程:
B 二 A 四 A 五 B 一 A 三
B 四 A 二 B 三 A 一 B 五 表一
首先把「A 五」放於上表的最左列,然後把所有與「A 五」彼鄰的狀 態(只有「B 一」)放於第二列;再把所有與第二列彼鄰,而又未在表 上出現的狀態,放在第三列。如此類推,直至「B 五」(即目標)出現 為止,便找到答案。按表一所列的結果,船夫要完成任務,最少要划 船七次,並有兩個不同的最優答案。
問題二:量水問題
岸 A 岸 B
狀態 一
二
三 四 五
我們先解決第一部分:若注滿 3 加侖的膠桶 n 次,及倒去 m 次 5 加侖水,剩下在膠桶中的水應為 3n 5− m;相反,注滿5 加侖的膠桶 n 次 及倒去 m 次 3 加侖水,剩下在膠桶中的水應為 5n 3− m。不管是以上哪個 情況,剩下的水的體積皆為 3 及 5 的線性組合,即必為 3 及 5 的最大公因 數的倍數(這是基礎數論中的結果,我們在此省略)。因3 和 5 的最大公因 數為 1,而 4 是 1 的倍數,故此,任務必能完成。剩下來的就是如何以最 少次數量得4 加侖水?
這又是窮舉法出場的時候,我們以
[ ] x, y 表示 3 加侖及 5 加侖水桶分 別載有 x 及 y 加侖的水,並假定兩個膠桶最初都是空的,即開始時
= 0
x = y (見表二中的第一列),再窮舉出往後的可能性。
第一步,我們只要考慮把水注滿兩個桶的其中一個,這時只可能出現 的只有 [3,0] 及 [0,5](見表二中的第二列)。其後考慮把水從載有水的桶 中,倒掉或倒進另一個桶,及把水注進未滿的水桶,最多共有 6 個可能。
而在較前列曾出現的狀態,毋須重覆列出。即考慮緊接 [3,0] 之後的狀態 時,因 [0,0] 已在表中,我們不需再列出把 3 加侖桶中的水倒掉的情況。
同時,因 3 加侖的水桶已滿,再無法注水。故此,剩下來的就只有把 3 加 侖桶中的水倒進 5 加侖的桶中,得 [0,3] 及 把水注入五加侖的桶中,得 [3,5]。按這個原則,把往後可能出現的狀態逐一列出,直至其中一個桶中 出現4 加侖的水,任務則告完成。
[0,3] [3,3] [1,5] [1,0] [0,1]
[3,0]
[3,5]
[3,5]
[0,0]
[0,5]
[3,2] [0,2] [2,0] [2,5] [3,4]
表二
從表二可見,使用兩個分別 3 加侖及 5 加侖的水桶,最少只須六步,
便可量出4 加侖的水。
以上的兩個都是人所共知的數學遊戲,我們都可使用窮舉法,尋找它 們的最優解,並且計算過程也毫不繁複。這說明只要找到一個具系統性的
參考資料
Enumerate。《國防科技大學 ACM/ICPC 高級演算法程式設計競賽線上判題系統》,
http://acm.nudt.edu.cn/~twcourse/EnumerateSearch.html。
Wolf sheep & cabbage. Plastelina. http://www.plastelina.net/game1.html 最短路問題。《維基百科》,http://zh.wikipedia.org/zh-hk/最短路問題。
《批踢踢實業坊》,http://www.ptt.cc/bbs/logic/M.1155913409.A.576.html。
Die Hard with a Vengeance. Wikia.
http://diehard.wikia.com/wiki/Die_Hard_with_a_Vengeance
作者電郵:[email protected]