資料結構 2 用棧實現迷宮問題的求解

2021-09-30 01:33:57 字數 4717 閱讀 5366

反思總結

最近看到一句區別棧和佇列很形象的話:

棧是先進後出,佇列是先進先出

所以吃多了吐就是棧,吃多了拉就是佇列

如上面的迷宮,用棧實現求迷宮路徑的程式,所求路徑不需要是最短路徑,但必須是簡單路徑,即在求得的路徑上不能重複出現同一通道塊。比如當走到(1,8)時,發現無路可走了,則依次退棧,退到能走通的通道快,而不是往回走(即(2,8)再次入棧)。

窮舉求解main函式裡首先要建立乙個自定義的迷宮。用乙個二維陣列來記錄迷宮,把牆的值設為0,即不可通,把通道的值設為1,即可通。這裡的程式把迷宮的四周都設定為牆,然後設定迷宮內部牆的位置,再指定迷宮的入口和出口。

int x, y, i, j, n;

cout <<

"輸入迷宮的行數,列數:"

<< endl;

cin >> x >> y;

for(i =

0; i < y; i++

)// 定義上下邊的牆值為0

for(j =

1; j < x -

1; j++

)//定義左右邊除了第一行和最後一行的牆值為0(第一行和最後一行在上個迴圈中定義過)

for(i =

1; i < x -

1; i++

)//定義所有內牆值為1(即通路)

for(j =

1; j < y -

1; j++

) m[i]

[j]=1;

cout <<

"請輸入迷宮的內牆數:"

<< endl;

cin >> n;

for(i =

0; i < n; i++

)

typedef

int mazetype[maxlength]

[maxlength]

;// 迷宮陣列[行][列]

mazetype m;

//宣告乙個全域性迷宮物件m

typedef

int status;

typedef

struct

//座標

postype;

typedef

struct

selemtype;

//棧的元素型別

typedef

struct

stack;

status initstack

(stack &s)

;// 構造乙個空棧s

status push

(stack &s, selemtype e)

;//入棧

status pop

(stack &s, selemtype &e)

;//出棧,移除當前棧頂元素

status stackempty

(stack s)

;//檢測是否為空棧

void

print

(int x,

int y)

;// 輸出迷圖,0表示牆,1表示通路

void

footprint

(postype a)

;// 使迷宮m的a點的序號變為足跡(curstep)

postype nextpos

(postype c,

int di)

;// 根據當前位置及移動方向,返回下一位置

void

markprint

(postype b)

;// 使迷宮m的b點的序號變為-1(不能通過的路徑)

status mazepath

(postype start, postype end)

;// 若迷宮maze中存在從入口start到出口end的通道,則求得一條存放在棧中(從棧底到棧頂),並返回true;否則返回false

#include

#include

//realloc函式標頭檔案部分編譯器不需要此行**

using

namespace std;

const

int error =0;

const

int ok =1;

const

int false =0;

const

int true =1;

const

int stack_init_size =

100;

const

int stackincrement =10;

const

int maxlength =25;

// 設迷宮的最大行列為25

int curstep =1;

// 當前足跡,初值為1

typedef

int mazetype[maxlength]

[maxlength]

;// 迷宮陣列[行][列]

mazetype m;

//宣告乙個全域性迷宮物件m

typedef

int status;

typedef

struct

postype;

typedef

struct

selemtype;

//棧的元素型別

typedef

struct

stack;

void

print

(int x,

int y)

// 輸出迷宮圖,0表示牆,1表示通路

}status initstack

(stack &s)

// 構造乙個空棧s

status push

(stack &s, selemtype e)

//入棧

*(s.top)

++= e;

/*或者

*s.top = e;

*s.top++;

*/return ok;

}status pop

(stack &s, selemtype &e)

//出棧,移除當前棧頂元素

status stackempty

(stack s)

//檢測是否為空棧

status pass

(postype b)

// 當迷宮m的b點的序號為1(可通過路徑),return ok; 否則,return error。

void

footprint

(postype a)

// 使迷宮m的a點的序號變為足跡(curstep)

postype nextpos

(postype c,

int di)

// 根據當前位置及移動方向,返回下一位置,,

,};//

// 移動方向,依次為東南西北

c.x +

= direc[di]

.x; c.y +

= direc[di]

.y;return c;

}void

markprint

(postype b)

// 使迷宮m的b點的序號變為-1(不能通過的路徑)

status mazepath

(postype start, postype end)

// 若迷宮maze中存在從入口start到出口end的通道,則求得一條存放在棧中(從棧底到棧頂),並返回true;否則返回false

else

if(e.di <3)

// 沒到最後乙個方向(北)}}

}while(!

stackempty

(s))

;return false;

}int

main()

for(j =

1; j < x -

1; j++

)//定義左右邊除了第一行和最後一行的牆值為0(第一行和最後一行在上個迴圈中定義過)

for(i =

1; i < x -

1; i++

)//定義所有內牆值為1(即通路)

for(j =

1; j < y -

1; j++

) m[i]

[j]=1;

cout <<

"請輸入迷宮的內牆數:"

<< endl;

cin >> n;

for(i =

0; i < n; i++

)print

(x, y)

;printf

("請輸入起點的行數,列數:");

cin >> begin.x >> begin.y;

printf

("請輸入終點的行數,列數:");

cin >> end.x >> end.y;if(

mazepath

(begin, end)

)// 求得一條通路

else

printf

("此迷宮沒有從入口到出口的路徑\n");

}

常常在程式中要使用到標誌變數,更好的運用標誌變數可以使程式更優秀。

資料結構 棧實現迷宮尋路問題

思路 解決迷宮求解的問題,從入口出發,順某一方向向前探索,若能走通,則繼續往前走 否則沿原路退回,換乙個方向再繼續探索,直至所有可能的通路都探索到為止。為了保證在任何位置上都能沿原路退回,所以需要用乙個後進先出的結構來儲存從入口到當前位置的路徑。因此,在求迷宮通路的演算法 塊maze.h defin...

c資料結構 棧 迷宮問題(迴圈實現)

走迷宮步驟 使用二維陣列來表示迷宮地圖。1表示可以走,0表示不能走。設定迷宮入口。判斷迷宮入口是否合法。將入口點入棧 將當前點設定為入口點。loop 判斷是否能往左走,能則將當前點壓棧。goto loop 判斷是否能忘上走,能則將當前點壓棧。goto loop 判斷是否能往右走,能則將當前點壓棧。g...

資料結構之用棧實現迷宮問題(dfs)

給乙個n n的方格,讓你求從左上角到所給一點的任意一條路徑並輸出 該題用到dfs,以下是對dfs的簡要解析 詳解請參見 傳送門 dfs是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的...