簡單迷宮
設定乙個簡單迷宮。(6*6)
定義迷宮入口。
迷宮入口要求:必須是邊界。
3.開始走迷宮
a. 走當前步: 當前步入棧,將當前步標記為2
b. 判斷當前棧頂元素是否是出口(是邊界卻不是入口),如果是就返回,若不是之星下一步。
c.取棧頂元素為當前步:
d.走下一步:
假設優先順序為上,左,右,下。
上:(橫座標減1,縱座標不變)
判斷是否是通路(即此處是否是1)
如果是通路,則走此步 ,此步入棧,將當前步標為2。
左:(縱座標減1,橫座標不變)
判斷是否是通路(即此處是否是1)
如果是通路,則走此步 ,此步入棧,將當前步標為2。
右:(縱座標加1,橫座標不變)
判斷是否是通路(即此處是否是1)
如果是通路,則走此步 ,此步入棧,將當前步標為2。
下:(橫座標減1,縱座標不變)
判斷是否是通路(即此處是否是1)
如果是通路,則走此步 ,此步入棧,將當前步標為2。
如果上下左右均不是通路,則證明此步走錯。應該回退到上一步重新找路徑(棧頂元素出棧)。迴圈執行b,c,d直至遇到出口為止。
迷宮具體分析:
我們需要乙個存放路徑的棧,由於此棧存放的是路徑,路徑有橫縱座標,所以也需要乙個結構體去實現。
//橫縱座標的值
typedef
struct position
position;
//靜態棧,用於儲存路徑
typedef
struct
stack
stack;
整體**:
.h檔案
#include
#include
#include
#include
#define row 6
#define col 6
//橫縱座標的值
typedef
struct position
position;
//靜態棧,用於儲存路徑
typedef
struct
stack
stack;
//初始化棧
void initstack(stack *s);
//走迷宮
void passmaze(int maze[row][col],position enter,stack* s);
//列印迷宮
void print(int maze[row][col]);
//列印迷宮路徑
void printstack(stack *s);
.c檔案
#include"maze.h"
//初始化棧
void initstack(stack *s)
//入棧
void pushstack(stack *s, position cur)
//棧頂元素
position topstack(stack *s)
//棧頂元素出棧
void popstack(stack *s)
//判斷是入口嗎?
int isenter(int maze[row][col], position enter)
else
return0;}
//是通路嗎?
int ispass(int maze[row][col], position next)
}return0;}
//是出口嗎?
int i***it(int maze[row][col], position enter, position cur)
return0;}
//走迷宮
void passmaze(int maze[row][col], position enter, stack* s)
//左通,從左走,標記
next = cur;
next.y = cur.y - 1;
if (ispass(maze, cur))
//右通,從右走,標記
next = cur;
next.y = cur.y + 1;
if (ispass(maze, next))
//下通,從下走,標記
next = cur;
next.x = cur.x + 1;
if (ispass(maze, next))
//若上左右下均不是通路,證明該步走錯,回退,且標記
//棧頂元素出棧
popstack(s);
maze[cur.x][cur.y] = 3;}}
}//列印迷宮
void print(int maze[row][col])
printf("\n");
}printf("\n");
}//列印迷宮路徑
void printstack(stack *s)
printf("\n");
}
測試檔案
#include"maze.h"
void testmaze()
, , ,,
,};position enter;
//定義棧,用於存放路徑
stack s;
//列印迷宮
print(maze);
//初始化棧
initstack(&s);
//定義乙個迷宮入口
enter.x = 5;
enter.y = 2;
//走迷宮
passmaze(maze, enter, &s);
//列印迷宮
print(maze);
//列印迷宮路徑
printstack(&s);
}int main()
執行:
poj 3984 迷宮問題 dfs 求迷宮路徑
利用圖論中深搜的思想,存在邊就是x,y x 1,y 還有x,y x,y 1 然後仍然是訪問未訪問的而且不是牆壁的地方。這樣保證不走已經搜尋過,走不通的路。唯一一種需要重複訪問已經訪問的結點的情況是已經無路可走了,只能返回,這樣就在棧中將路徑取出來,把自己現在的那個先pop掉,然後實現回溯。最後用向量...
poj 3984 迷宮問題 dfs 求迷宮路徑
利用圖論中深搜的思想,存在邊就是x,y x 1,y 還有x,y x,y 1 然後仍然是訪問未訪問的而且不是牆壁的地方。這樣保證不走已經搜尋過,走不通的路。唯一一種需要重複訪問已經訪問的結點的情況是已經無路可走了,只能返回,這樣就在棧中將路徑取出來,把自己現在的那個先pop掉,然後實現回溯。最後用向量...
棧的基本應用 求迷宮的路徑
include stdafx.h typedef structcoordinate typedef struct item define maze line 10 define maze row 9 int a maze row maze line int mark maze row maze li...