用棧和遞迴求解兩頂點的所有簡單路徑

2021-05-17 15:37:24 字數 869 閱讀 9709

用棧和遞迴求解兩頂點的所有簡單路徑

棧和遞迴在程式設計中的應用是非常廣的,比如對於迷宮的求解、表示式的求解,等都可以用棧來解決,典型的hanoi塔問題,樹和圖的遍歷等都可以用遞迴來解決,在資料結構等很多書中都有介紹,如果對此不了解,可去參考。遞迴演算法的設計實際上就是對問題的抽象的過程,如果抽象到每個小問題都有相同特徵時,那就形成了遞迴,遞迴演算法簡明易懂,下面我就介紹一種利用到棧與遞迴求解兩頂點所有簡單路徑的問題。

先說明一下什麼叫「兩頂點的所有簡單路徑」的概念,「兩頂點的所有簡單路徑」的意思通熟的講就是在圖中有若干點,點與點之間可有邊相連(在資料結構中叫「圖」),任意設個起點和終點,現在要求的是從起點到終點所有可能通過的邊序列的集合。(注:是簡單有序邊,也就是說簡單路徑,所謂簡單路徑就是序列中頂點不重複出現的路徑。)舉個例子:從上海到北京,我可以直接到達,也可以先到四川,再到北京,或者先到廣東,再到北京,等等。如:上海->四川->上海->北京,這就不是簡單路徑了,顯然,不是簡單的路徑有無數條。

為了描述方便,我用了簡單的二維陣列來做儲存結構。(當然,完全可以用鄰接矩陣、鄰接表、十字鍊錶、鄰接多重表等來表示)* * *

* * *

* * *

如上圖左上角的座標為(1,1),右上角的座標為(3,1),左下角的座標為(1,3),右下角的座標為(3,3),點與點之間都可相通,假設從點(1,1)要到(3,3),有多少種走法?

對這個問題的求解先要認識到它的本質,其本質是乙個點有四個方向(各邊特殊處理),依次探索四個方向上的點,判斷是不是最後的目的地,如果是,則進棧並返回,如果不是則進棧,將此點同樣上述處理。顯然這個過程是乙個遞迴的過程,直到是最後的目的地,才層層返回。

當然,解決此問題不是只有棧與遞迴才能解決,經我自己摸索,用生成樹的方法訪問其雙親結點,也可解決,如果有更好的方法,請多多指教。

漢諾塔的改編題(用棧求解,分別遞迴和非遞迴)

限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而是必須經過中間,求當塔有n層的時候,列印最優移動過程和最優移動總步數 例如 當塔為兩層時,最上層的塔記為1,最下層的塔記為2,則列印 move 1 from left to mid move 1 from mid to righ...

用遞迴列出和刪除檔案的所有目錄

遞迴 recursion 就是方法呼叫自身。對於遞迴來說,一定有乙個出口,讓遞 歸結束,只有這樣才能保證不出現死迴圈。遞迴計數器 private static int time public static void recursion 一個簡單的遞迴例項 階乘 public static int f...

用棧求解迷宮問題的所有路徑及最短路徑程式

目的 掌握棧在求解迷宮問題中的應用。內容 編寫乙個程式,輸出迷宮的所有路徑,並求第一條最短路徑長度及最短路徑。如下 include include include include using namespace std define inf 0x3f3f3f const int maxsize 10...