設有n個城市,編號為0~n-1;
有m條航線,以起點和終點標記。
要求當使用者從鍵盤輸入始發城市和目的城市編號後,程式可以在螢幕上顯示乙個換乘次數最少的乘機方案。
首先,航線地圖即全部航線的記錄選擇的資料結構是圖,當然也可以採用其他可以記錄類似於起點->終點這種資訊的其他結構,這裡我們就用圖好了。
其次,圖的描述採用鄰接矩陣,僅僅是為了演算法思想的**實現更加方便,而不考慮其他方面的因素。
對圖從起點開始進行廣度優先遍歷,當遇到目的地時就意味著最少換乘方案的形成。
這是因為:對圖進行層次遍歷時每深入一層,意味著換乘次數加一,所以當遍歷到目的地時自然是換乘次數最少的方案。
這種方案有如下問題要解決:
解決方案是:
1、將節點的結構設定為:該節點本身資訊的載體c(比如在矩陣中的下標)+指向使它進入佇列的節點的指標b。當求解問題時使用b指標來記錄一種引入與被引入的關係。這樣,一旦找到目的地,我們就可以「順藤摸瓜」找到一條路徑,而這「藤」的盡頭就是路徑的起點,它的b指標是null,因為沒有節點引它入佇列。這要求我們在訪問完乙個節點後,在將它的鄰接點放入佇列前設定後這些關係。即:訪問->設定引入關係->入佇列;出佇列->訪問->設定引入關係->入佇列;直到找到目的地d,然後通過b指標找到引入d的節點d1,之後一直進行,直到dx的b指標為null,形成路徑;或者結束廣度遍歷,沒有合適的路線。
2、因為不知道如何儲存,所以就不儲存路徑資訊,轉而記錄引入關係。
同樣,我們還是要解決路徑的記錄問題。解決方法實際上還是採用反向追朔的方法。書上採用的方法是設定了長度為n的陣列path,如果在路徑上節點i的前驅是節點j,那麼path[i]=j,這裡的i和j都是矩陣中用來標記節點的int型別值。相比採用重新設定節點結構的方法,這種方法對於已有**:原來表示節點的結構或者類的**以及建構函式中用來初始化節點資訊的**的影響要小的多,因為只需要增加並且初始化乙個陣列而已。改變節點結構的方法雖然達到相同的目的,但是涉及的改動太多,即引入的「變化」太多。不是很理想的方法。
八皇后問題的兩種解決方法
最近看到遞迴,原本利用回溯思想解決的經典八皇后問題,其實也是可以用遞迴解決的 八皇后的遞迴解決思路 從第一行開始,依次判斷0 8列的哪一列可以放置queen,這樣就確定了該行的queen的位置,然後行數遞增,繼而遞迴實現下一行的判斷,依次類推直到行數增加到8 行數從0開始的 此時為遞迴 歸的條件,即...
開關燈問題兩種解決方法
有編號1 100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。現在開始按開關。第1個同學,把所有的燈泡開關都按一次 按開關燈的編號 1,2,3,100 第2個同學,隔乙個燈按一次 按開關燈的編號 2,4,6,10...
Ajax跨域問題的兩種解決方法
瀏覽器不允許ajax跨站請求,所以存在ajax跨域問題,目前主要有兩種辦法解決。1 在請求頁面上使用access control allow origin標頭。header access control allow origin header access control allow origin ...