利用順序棧實現資料結構中的迷宮求解問題
首先初始化乙個二維陣列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 迷宮交岔路結點 我們要有乙個掃瞄通路的函式,對乙個座標進行東南西北的掃瞄,...