資料結構 棧應用 迷宮(簡單vs高階)

2021-08-25 02:42:01 字數 3159 閱讀 5450

題目

對於給定條件的迷宮,若只有一條出路,求出口,若有多條出路,求最短路徑!

迷宮大概可分為三類:

思路對於迷宮問題,我們首先應該有回溯的思想:

回溯演算法實際上乙個嘗試搜尋的過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。

在本題中也用到的就是回溯, 就是把走過的點座標壓棧,遇到無路可走的情況就開始回溯,也就是出棧!

思路:首先,將入口座標壓入棧中,確定棧頂元素入口座標為當前位置,並且將走過的座標標記,以免走回頭路。從當前位置開始探索上下左右四個方向,能通過則壓棧繼續切換當前位置前進,但是如果遇到死胡同(四個方向都不通),則回溯,既出棧一次,把棧頂座標當做是當前位置,繼續探索。探索過程中如果遇到終點,則直接結束;如果沒有終點,則會一直回溯到起點,這時棧一定為空。此時,迷宮沒有通路。

參考**
//檢查當前位置是否可通

static int checkaccess(pos

next)

else

}//乙個入口,乙個出口,求一條通路(返回1有通路,返回0沒有通路)

int getmazepath(pos entry, pos

exit)

//上next = pcur;

next.row -= 1;

if (checkaccess(next))

//下next = pcur;

next.row += 1;

if (checkaccess(next))

//左next = pcur;

next.col -= 1;

if (checkaccess(next))

//右next = pcur;

next.col += 1;

if (checkaccess(next))

//當前座標不通,則出棧回溯,把上乙個結點當做當前位置繼續探索

stackpop(&s);

}}void test()

思路:在求解第一類迷宮的基礎上,當遇到乙個終點的時候,不要直接返回程式,而是繼續探索回溯,找到下乙個終點,繼續回溯。然後,設定乙個全域性的變數來記錄最短路徑的長度,第一次到達終點,把路徑長度賦值給全域性變數,在以後的回溯中遇到終點則比較,如果小於全域性變數的值,則更新。

參考**
//檢查當前位置是否可通

static int checkaccess(pos pcur, pos

next)

else

}int getmazepath(pos entry)

//上next = pcur;

next.row -= 1;

if (checkaccess(pcur, next))

//下next = pcur;

next.row += 1;

if (checkaccess(pcur, next))

//左next = pcur;

next.col -= 1;

if (checkaccess(pcur, next))

//右next = pcur;

next.col += 1;

if (checkaccess(pcur, next))

//當前座標不通,則出棧回溯,把上乙個結點當做當前位置繼續探索

stackpop(&s);

}stackdestory(&s);

return shortpath;

}void test()

上邊的**雖然很好的求出來最小路徑,但是這個程式是有侷限性的,它值適用於對迷宮路徑中不帶環的通路進行求解,如果迷宮中的路徑是帶環的,這道題的解法就是錯誤的

思路換一種標記方式,從入口開始標記2,然後後邊標記的值依次比前面標記的值要大於1。既然標記方式被改變了,那麼回溯到前乙個座標時,再去檢查前乙個座標的下乙個位置是否可通的方法也就被改變了。

參考**
//檢查當前位置是否可通

static int checkaccess(pos pcur,pos

next)

else

}//返回最短路徑

int getmazepath(pos entry)

//上next = pcur;

next.row -= 1;

if (checkaccess(pcur,next))

//下next = pcur;

next.row += 1;

if (checkaccess(pcur, next))

//左next = pcur;

next.col -= 1;

if (checkaccess(pcur, next))

//右next = pcur;

next.col += 1;

if (checkaccess(pcur, next))

//當前座標不通,則出棧回溯,把上乙個結點當做當前位置繼續探索

stackpop(&s);

}stackdestory(&s);

return shortpath;

}void printmaze()

printf("\n");

}printf("\n");

}void test()

結語
夜空的璀璨,職位迎接更美好的明天!

資料結構之棧的應用 迷宮求解

程式設計思想 1 迷宮地圖相關 利用動態二維陣列來初步勾勒出迷宮 建議先用malloc申請一維陣列,再用calloc申請每個元素中的一維陣列,因為我用的是1來表示迷宮的通路,0表示死路,calloc申請完後就會自動初始化為0 迷宮交岔路結點 我們要有乙個掃瞄通路的函式,對乙個座標進行東南西北的掃瞄,...

《資料結構》 棧的應用 迷宮求解問題

利用棧求解迷宮問題 只輸出乙個解,演算法3.3 typedef struct 迷宮座標位置型別 postype define maxlength 25 設迷宮的最大行列為25 typedef int mazetype maxlength maxlength 迷宮陣列 行 列 全域性變數 mazety...

資料結構之 棧應用 老鼠迷宮問題

老鼠迷宮問題是棧應用問題的乙個入門,通過對滿足要求的迷宮位置壓棧,同時,將位置置為不可用,來實現對從迷宮入口到出口的路徑尋找 非最優路徑 下面是關鍵的 include mymatrix.cpp include include mystack array.cpp include pos.h void ...