生活随笔
收集整理的這篇文章主要介紹了
迷宫求解(非递归)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????上篇文章寫出了利用函數形成棧楨的特性完成迷宮求解問題, 本篇文章我們自己手動維護一個棧, 其進行出棧, 入棧, 取棧頂元素, 來完成迷宮求解尋路的過程
????思路和以前一樣, 首先, 我們先定義一個棧, 對其初始化, 同時, 定義一個迷宮地圖, 對該地圖進行初始化, 先判斷當前位置是否可以落腳, 如果不能落腳就直接 return, 如果能夠落腳, 就將入棧同時將其標記, 標記完之后就循環(huán)取棧頂元素, 直到取棧頂元素失敗時回溯, 每取一個棧頂元素就判斷一下該棧頂元素是否是出口, 如果是出口, 就說明迷宮探測完畢, 如果不是出口,就按順序(順時針)探測該點四周的點, 判斷該位置是否可以落腳, 能落腳就將其標記, 然后將其入棧,然后進入下以次循環(huán), 如果四周的點都探測完畢, 此時就可以回溯了(出棧)
void GetPathByLoop(Maze* maze, Point entry)
{
if(maze == NULL){
return;}
if(entry.row <
0 || entry.row >= MAX_ROW || entry.col <
0 || entry.col >= MAX_COL){
return;}SeqStack
stack;SeqStackInit(&
stack);
if(!CanStay(maze, entry)){
return;}SeqStackPush(&
stack, entry);
while(
1){Point cur;
int ret = SeqStackGetFront(&
stack, &cur);
if(ret ==
0){
return;}
if(IsExit(maze, cur, entry)){
printf(
"找到了一條路\n");
return;}
printf(
"(%d, %d)\n", cur.row, cur.col);Point up = cur;up.row -=
1;
if(CanStay(maze, up)){Mark(maze, up);SeqStackPush(&
stack, up);
continue;}Point right = cur;right.col +=
1;
if(CanStay(maze, right)){Mark(maze, right);SeqStackPush(&
stack, right);
continue;}Point down = cur;down.row +=
1;
if(CanStay(maze, down)){Mark(maze, down);SeqStackPush(&
stack, down);
continue;}Point left = cur;left.col -=
1;
if(CanStay(maze, left)){Mark(maze, left);SeqStackPush(&
stack, left);
continue;}SeqStackPop(&
stack);}
}
總結
以上是生活随笔為你收集整理的迷宫求解(非递归)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。