C 棧實現資料結構中的迷宮求解

2021-07-24 21:34:45 字數 2496 閱讀 3206

利用順序棧實現資料結構中的迷宮求解問題

首先初始化乙個二維陣列vector>,將障礙物標記為-1,為走過的點標記為0,走過的點標記為1

從入口位址開始,依次按上下左右四個方向尋找是否有可以通行的點,如果有,則將該點的座標位置入棧,並將該點標記為1,以重複走以走過的點,如果四個方向均未找到可以通行的點,則出棧,直到找到有可以通行的點,重複此過程,最後入棧的座標位置等於出口位置時,結束此過程,並倒序輸出棧中的路徑點。

演算法實現過程如下:

#include "stdafx.h"

#include #include#define stack_init_size 100

#define stack_increment 20

using namespace std;

typedef struct elemstruct

elem;

typedef struct stack

sqstack;

//初始化棧

void initstack(sqstack *&s)

else

}//判斷棧是否為空

bool isemptystack(sqstack *s)

else }

//遍歷棧

void printstack(sqstack *s)

s->top = top;

cout << endl;

} else }

//倒序遍歷

void inverseprintstack(sqstack *s)

s->base = p;

cout << endl;

} else }

//壓棧,前進

void pushstack(sqstack *s, elem *e)

} elem *p;

p = s->top;

*p++ = *e;

s->top = p;

}//出棧,後退

elem* popstack(sqstack *s)

else }

//迷宮尋道

void findroad(vector> &maze, int entrancex, int entrancey, int endx, int endy)

key->x = entrancex;

key->y = entrancey;

maze[entrancex][entrancey] = 1;

initstack(s);

pushstack(s, key);

int i = entrancex, j = entrancey;

int q = 0, w = 0, e = 0, r = 0;

while (true)

//計算標誌q;

if (j - 1 >= 0)//檢查陣列是否越界

else

}else

//計算標誌w;

if (j + 1 < 10)

else

}else

//計算標誌e;

if (i + 1 < 10)

else

}else

//計算標誌r;

if (i - 1 >= 0)

else

}else

if (q)//左邊乙個位置

else if (w)//右邊乙個位置

else if (e)//下

else if (r)//上

else

else

} }}

void main()

} //設定障礙物

for (int j = 0; j < 10; j++)

maze[1][3] = maze[1][7] = maze[2][3] = maze[2][7] = -1;

maze[3][5] = maze[3][6] = maze[4][2] = maze[4][3] = maze[4][4] = -1;

maze[5][4] = maze[6][2] = maze[6][6] = maze[7][2] = maze[7][3] = maze[7][4] = maze[7][6] = maze[7][7] - 1;

maze[8][1] = -1;

//entrancex,entrancey入口位址的x和y座標;endx,endy出口位址的x和y座標

int entrancex = 1, entrancey = 1, endx = 8, endy = 8;

findroad(maze, entrancex, entrancey, endx, endy);

system("pause");

}

執行結果如下:

另外有一種比較簡潔的寫法實現迷宮求解問題:回溯法

具體**實現:請參考

回溯法實現迷宮求解

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

反思總結 最近看到一句區別棧和佇列很形象的話 棧是先進後出,佇列是先進先出 所以吃多了吐就是棧,吃多了拉就是佇列 如上面的迷宮,用棧實現求迷宮路徑的程式,所求路徑不需要是最短路徑,但必須是簡單路徑,即在求得的路徑上不能重複出現同一通道塊。比如當走到 1,8 時,發現無路可走了,則依次退棧,退到能走通...

C 棧實現迷宮求解

給出乙個迷宮,求解從路口到出口的全部路徑是乙個經典問題,c 實現 如下 algrithm practice.cpp 定義控制台應用程式的入口點。include stdafx.h using namespace std define d 10 迷宮的維度 include includeint maze...

資料結構之棧的應用 迷宮求解

程式設計思想 1 迷宮地圖相關 利用動態二維陣列來初步勾勒出迷宮 建議先用malloc申請一維陣列,再用calloc申請每個元素中的一維陣列,因為我用的是1來表示迷宮的通路,0表示死路,calloc申請完後就會自動初始化為0 迷宮交岔路結點 我們要有乙個掃瞄通路的函式,對乙個座標進行東南西北的掃瞄,...