搜尋迷宮路徑

2021-09-27 16:17:46 字數 2909 閱讀 4549

從入口出發,按某一方向向前探索,若能走通則到達新點,並試探下一方向;若所有方向均沒有通路,則沿原路返回前一點,換下乙個方向再繼續試探,知道所有可能的路徑都試探到,或找到出口,或者無路可走退回到入口.為了能夠保證在到達某一點後不能繼續向前走時能退回到上乙個點並繼續進行下乙個方向的探尋,則需要有乙個能滿足"後進先出"的資料結構—棧 來儲存能夠到達的每乙個點的座標及其前進的方向.

(一)迷宮的資料結構的表示

設迷宮為m行n列,利用maze[m][n]來表示乙個迷宮,maze[i][j]=0或1,其中0表示通,1表示不通,當從某點向下試探時有8個方向可試探,而四角的點有3個方向可試探,邊緣的點有5個方向可試探,為使問題簡化,可用maze[m+2][n+2]來表示迷宮,則每個點都有8個方向一致

迷宮的定義如下:

#define m 6

#define n 8

int maze[m+2][n+2]

(二)試探方向的資料結構的表示每個座標點有八個方向可以試探,規定試探順序:從當前位置向前試探的方向為從正東沿順時針方向進行.為了簡化問題,方便求出新點的座標,可將八個方向關於x和y的增量存入結構陣列move[8]中.

move陣列定義如下

typedef struct

increase;

increase move[8];

(三)棧的設計
typedef struct

position;

typedef struct stacknode

stacknode,*linkliststack;

資料結構定義

#include

#include

#include

#define m 6

#define n 8

#define m 3

#define n 1

int maze[m+2]

[n+2];

//表示迷宮的資料結構

typedef

struct

position;

typedef

struct stacknode

stacknode,

*linkliststack;

typedef

struct

increase;

increase move[8]

;//定義增量陣列

函式宣告

linkliststack init_stack()

;void

push_stack

(linkliststack,position)

;void

pop_stack

(linkliststack top,position * date)

;int

empty_stack

(linkliststack top)

;void

init_maze

(int maze [m+2]

[n+2])

;void

init_increase

(increase)

;int

maze_research

(linkliststack top)

;

棧的函式定義

linkliststack init_stack()

top->pnext=

null

;return top;

}void

push_stack

(linkliststack top,position date)

s->date=date;

s->pnext=top->pnext;

top->pnext=s;

}void

pop_stack

(linkliststack top,position * date)

intempty_stack

(linkliststack top)

迷宮和增量陣列的函式定義

void

init_maze

(int

(*maze)

[n+2])

for(

int j=

0;j2;j=j+n+1)

for(

int i=

1;i<=m;i++)}

void

init_increase

(increase move[8]

)

搜尋迷宮路徑函式

int

maze_research

(linkliststack top)

else

d++;}

}}

主函式

int

main

(void)}

else

printf

("迷宮無路可走!");

}

迷宮隨機生成及路徑搜尋

這個題目和資料結構 圖有關 迷宮的隨機生成和路徑搜尋主要和圖的遍歷有關,一般來說圖的遍歷主要有兩種方式 1 深度優先遍歷 dfs 2 廣度優先遍歷 bfs 兩種遍歷方式都很好理解,就說說深度優先遍歷 可以這樣描述深度遍歷 1 訪問頂點v 2 從v的未被訪問的鄰接點中選取乙個頂點w,重複第一步,如果v...

迷宮路徑問題廣度優先搜尋模板

總時間限制 1000ms 記憶體限制 65536kb 描述定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。輸入乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。輸出左上角...

迷宮(深度搜尋 存最短路徑)

問題描述 定義乙個二維陣列 定義乙個5 5的陣列maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。輸入 乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。輸出 左上角到右下角的最短路徑,格式如樣例所...