求簡單迷宮的路徑

2021-08-25 22:55:38 字數 3386 閱讀 2836

簡單迷宮

設定乙個簡單迷宮。(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...