展開選單

網站服務選單

登入

頁面路徑列表

子選單列表

充電5分鐘5-Minute Reading

曹操如何用「普林演算法」找到官渡之戰的最佳縱火路線?

  • 字級


曹操官渡破袁紹(圖/wiki


我們喜歡看歷史故事,不同角色在時代的舞台上粉墨登場,激盪出燦爛絢麗的火花。
我們討厭算數學題目,不同公式在抽象的課本中擠成一團,編織成堅硬無趣的知識。
但你凝神一看,歷史故事裡處處是數學題目,好些細節不靠數據分析還揪不出來。
歷史故事看得多,數學題目做得少。這次讓我們平衡一下,來一段數感演義。



 

三國其實很有趣之2:官渡之戰

三國其實很有趣之2:官渡之戰

《三國演義》中最關鍵的三大戰役莫過於阻擋曹操南下的赤壁大戰,毀滅劉備復仇之路的夷陵之役,還有決定曹操與袁紹誰能稱霸中原的「官渡之戰」。其中,官渡之戰因為少了劉備軍,打贏的又是被設定成反派梟雄的曹操,相較之下沒有描述得那麼轟轟烈烈。但其實這是一場(其實三場都是)少勝多,多算勝少算的經典戰役。

會戰中,曹操靠著火燒袁紹烏巢糧倉,一口氣逆轉戰局,還拉到張郃投誠。到底曹操「多算」了什麼,今天讓我們進到三國演義,空想補齊這段利用數學,成功突襲烏巢的過程。

「公何輕生至此?袁紹不納直言,後必為曹操所擒。公既與曹公有舊,何不棄暗投明?」只這兩句言語,點醒許攸;於是許攸逕投。
後人有詩歎曰:本初豪氣蓋中華,官渡相持枉歎嗟。若使許攸謀見用,山河豈得屬曹家?卻說許攸暗步出營,逕投曹寨……

許攸來到曹操大寨,曹操開心得鞋子都沒穿就出來迎接,請教他有沒有什麼方法能打敗袁紹。許攸沒回答這問題,反而先問曹操:

「你剩多少軍糧?」
「一年。」
「你剩多少軍糧?」
「半年。」
「你剩多少軍糧?」
3個月。」
所以現在是首項為1年,公比1/2的等比數列就是了!少騙我,你根本沒軍糧了!」

許攸從懷裡拿出曹操跟在後方荀彧求援的信件,這下曹操才驚覺原來信早在半路被袁紹攔截。這下慘了,不僅求援失敗要斷糧,袁紹也知道這一切了。不過,曹操轉念一想,在這種己方必敗的情況下,許攸還帶著這封信來投靠,自然是想好反撲策略了。曹操握住許攸的手,懇求他的幫忙。許攸慢條斯理地回答:

「我說啊,你打袁紹是以少對多,不求速戰速決,根本是找死。好在我有一條計策,包你三天內能讓袁紹百萬大軍,不攻自破。」

許攸停了幾秒,整個大寨靜得只聽得到許褚的呼吸聲。許攸緩緩吐出四個字:

火燒烏巢。

原來,烏巢是袁紹大軍的糧倉安置之地,卻只派了一個比張飛還愛喝酒的淳于瓊駐守。許攸的策略是,叫曹操帶一隻精兵,假扮成袁紹部將蔣奇的手下去幫忙護糧,趁機一把火燒了整個烏巢。少了烏巢糧草,袁紹比曹操更快撐不住。

「就這麼辦!」

曹操大喜,立刻規劃奇襲。

操笑曰:「吾已籌之熟矣。」  

不是所有人都像曹操這樣相信一個剛投降過來的許攸。張遼就擔心袁紹會趁曹軍偷襲時,反過來趁虛來襲。曹操當然也知道,他早就規劃好一切,留下軍師荀攸賈詡曹洪守大寨:

「許攸你就在曹洪旁邊幫忙吧。」

他還埋下伏筆,要是袁紹真的突襲過來,兩軍第一個陣亡的就是許攸。不僅如此,曹操還叫夏侯兄弟、曹仁跟李典各自帶一隻軍隊埋伏在主寨左右,反過來偷襲袁紹的來軍。簡單的幾個安排,就看得出來三國第一人的心機有多重

但也因為這樣,曹操能調動奇襲的部隊只剩5000兵馬,還有張遼、許褚、徐晃、于禁等四位將領。烏巢是袁紹百萬大軍的糧倉之處,就算駐軍不多,要燒光整個糧倉也不是一件容易的事情。眾人見曹操胸有成竹的模樣,也不敢多說什麼。

當夜,曹操全軍換上袁紹軍的裝扮,每個人揹著乾柴乾草,靜悄悄地往烏巢出發。經過袁紹軍駐防的地方,都只靠「我們是蔣奇將軍派來幫忙烏巢護糧的部隊」,袁軍看見是自己人的旗幟,便也沒多想就放行。就這麼順利地來到烏巢,許褚放下他扛的那捆,是別人三倍份量的薪柴,用自以為放低的音量大喊:

「俺先去砍了淳于瓊!」
「噓!!」

曹操叫許褚安靜,吩咐于禁攤開一張地圖。

烏巢的七大糧倉與沿路駐軍數目

 

「這是烏巢七個大糧倉的位置,我們現在在甲地。」

這才是曹操的最後一手,他早把烏巢的細節摸得一清二楚。張遼問:

「每條路線上的數字代表的是?」
「沿路上的敵軍數目。」

曹操回答完接著說:

「乙是淳于瓊看守的最大糧倉。你看,如果貿然直衝大本營,我們會遭受到極強的抵抗。就算殺掉淳于瓊,剩下的軍力也無法燒掉全部的糧倉。」
「應該先分頭去戊跟己。」

張遼說,曹操點點頭。他的安排正是由他跟徐晃、張遼、許褚先去戊,于禁去己。于禁不解:

「只有我去己?那我到了己之後不用推進到乙或壬前進嗎?」
「己到乙有8千敵軍,比丙到乙多還多1千。同樣的道理,己到壬有破萬敵軍,」

曹操頓了頓,

「但如果我們另一支部隊,從戊出發,經過丙殺到乙,斬了淳于瓊後,趕快到丁跟壬。這樣就能遇到最少的敵軍抵抗,最可能成功攻下7座糧倉。」

曹操的規劃

 

眾人發出「噢~~~~」的一聲,的確如此。張遼算了算,以這個狀況來說,只會遇到35千人馬,以5000人突襲來說,以小博大是很有機會獲勝的。反過來說,如果貿然直接衝主寨,再從主寨往其他糧倉襲擊,最高有可能得面對57千敵軍,這還不包括襲擊主寨後驚動全軍,讓各線的駐軍都移動起來的變化。曹操光是掐指計算,就讓敵軍少了22千人,眾將在心底對他們的主公更增添了欽佩之意。

直擊主寨乙後的最糟狀況

就這樣,曹操吩咐一個小隊長駐守甲,跟于禁兩軍分開後,不花什麼力氣到了戊,再前進到丙。他讓徐晃留守丙點,自己帶著張遼、許褚往淳于瓊主寨前進。

時淳于瓊方與眾將飲了酒,醉臥帳中;聞鼓譟之聲,連忙跳起問:「何故喧鬧?」言未已,早被撓釣拖翻。眭元進、趙叡運糧方回,見屯上火起,急來救應。曹軍飛報曹操,說:「賊兵在後,請分軍拒之。」

沒想到這時候剛好眭元進趙叡兩名敵將回來,曹操心裡大喊僥倖,還好有派徐晃跟于禁留守,暫時可以擋一擋。他要許褚留守主寨,自己跟張遼急速分頭攻打丁跟壬,一到現場,立刻點燃大火,其他據點的曹軍看見火光,也紛紛燒起來,一時間,整座烏巢陷入火海。

「回頭跟于禁徐晃會合!」

曹操一聲令下。

眾軍將無不爭先掩殺。一霎時,火燄四起,煙迷太空。眭、趙二將驅兵來救,操勒馬回戰。二將抵敵不住,皆被曹軍所殺,糧草盡行燒絕。淳于瓊被擒見操,操命割去其耳鼻手指,縛於馬上,放回紹營以辱之。

另一邊,袁紹聽聞軍情來報北方大火,知道是烏巢有失。這時他有兩個選擇,

  1. 全軍前往援救烏巢,提案者張郃。
  2. 分成兩路,一路救烏巢,一路攻打曹操主寨,提案者郭圖。

袁紹總是有辦法做出最壞的決定,他命令第一個提案者去執行第二個提案,要張郃率軍攻打曹操主寨。結果正中陷阱,不僅曹操有留荀攸防守,兩旁的伏兵更是把張郃和一同前往的高覽打得落花流水,郭圖害怕張郃回來跟他算帳,先一步跟袁紹說:

「一定是張郃沒有認真打才會打不贏。」

再去跟張郃說:

「主公要殺你了。」

一來一往,逼得張郃與高覽主動降曹。

二人倒戈卸甲,拜伏於地。操曰:「若使袁紹肯從二將軍之言,不至有敗。今二將軍肯來相投,如微子去殷,韓信歸漢也。」遂封張郃為偏將軍都亭侯,高覽為偏將軍東萊侯。二人大喜。

從烏巢大勝歸來的曹操,意外又獲得了這個禮物,收集全了神奇寶貝五子良將(張遼、樂進、于禁、張郃、徐晃)的最後一位。

紹急渡河,盡棄圖書車仗金帛,止引隨行八百餘騎而去。 

這場烏巢大火,燒出了曹操一統北方的大局,自此袁紹再無反撲之力。這一切多虧了曹操選定的烏巢縱火路線。這套技巧在1700年後由捷克數學家亞爾尼克和美國科學家普林分別發現,後人稱之為普林演算法(Prim Algorithm,用來找出一張圖裡的最小生成樹(minimum spanning tree),意思是能用最低的成本,連結起圖裡面的每一個點。曹操就是找到了「烏巢」這張圖中的最小生成樹,才能僅憑著五千兵馬,成功的火燒烏巢。



作者簡介

數學作家、譯者,認為數學不只是助眠跟考試工具,而是一種精準描述的語言。理解數學,就能用另一種更理性與特殊的角度來理解世界。文章散見於《聯合報》《國語日報》《未來少年》數學專欄,著書有《超展開數學教室》《葉丙成的機率驚艷》《再見,爸爸》《超展開數學約會》,曾獲時報文學獎(書簡組),菠羅科學獎(數學)。
2017年OKAPI全新推出:賴以威專欄【數感演義】(歡迎至網頁右上角點選訂閱OKAPI電子報)


延伸閱讀

上下則文章

主題推薦RELATED STORIES

回文章列表

關閉

主題推薦

吵完0是不是偶數,要不要來做些更進階的三國數學?

如何不著痕跡統計討厭曹操的人數?「連環計」背後的數學原理是什麼?三國趙雲如何用數學進行即刻救援?

2515 1