棧求解迷宮問題

2021-07-11 03:32:32 字數 2054 閱讀 1493

問題:假設下圖1是某迷宮的地圖(0代表路徑,1代表牆壁),問此迷宮是否有條通路?

求解思想:

用棧來實現解決問題,主要步驟是

(1)將迷宮的入口座標設為當前座標

(2)將當前座標壓棧,將當前座標上的值設為2(0變為2),代表已走過的路

(3)判斷當前座標的四周(上下左右)是否是可以通(為0則通)的,如果是通的,那就將它的座標設為當前座標

(4)重複(2)(3)的操作

(5)若遇到如圖1中標註的座標,四周都不可以通(四周都不為0),那麼就回退(將棧中的座標彈出),將棧頂座標設為當前座標,重複步驟(3)

(6)當退回到兩路的相交處則當前周圍有路可以通,重複步驟(2)(3)

(7)只要判斷當前位置在迷宮地圖的邊緣(只有邊界值為0時,當前位置才可以到達邊界),那麼就可以判斷該迷宮是否可以通

棧中的元素是迷宮通路的路線,若棧為空,則迷宮沒有通路

解題程式:

#include#include#includeusing namespace std;

struct pos

;#include "maze.h"

bool checkpath(int *a, pos next, int n)

void getmaze(int *a, int n)

else

}} fclose(fout);//關閉檔案

}void printmaze(int *a, int n)//列印迷宮

cout << endl;

} cout << endl;

}bool mazepath(int *a, int n, pos entry, stack& path)//判斷迷宮是否有通路

a[cur._row*n + cur._col] = 2;//將該位置置為2,代表已走過的路

next = cur;

next._col++;//若下乙個位置是當前位置的右邊

if (checkpath(a, next, n))//若下乙個位置的值合法且為0(可以通),則跳到下乙個位置,且壓棧

//若不可以通那麼就判斷令乙個方向的位置的值

next = cur;

next._row++;

if (checkpath(a, next, n))//同理

next = cur;

next._row--;

if (checkpath(a, next, n))//同理

next = cur;

next._col--;

if (checkpath(a, next, n))//同理

cur = path.top();//當四周都不可以通則回退,將當前位置置為棧頂元素的座標位置

path.pop();//頂元素彈出

} return false;//若棧為空,那麼迷宮沒有通路

}#include "maze.h"

int const n = 10;

void testmaze()

; getmaze((int *)a, n);

printmaze((int *)a, n);

stackpath;

pos entry = ;

bool ret = mazepath((int *)a, n, entry, path);

cout << "是否有通路" << ret << endl;

printmaze((int *)a, n);

}int main()

執行結果:

當迷宮有出口,則執行結果如圖:返回1

當迷宮沒有出口時,執行結果如下圖:返回1

棧 求解迷宮問題

問題 在迷宮中尋找一條路徑 演算法分析 將迷宮數值化,使用二維陣列來表示迷宮,牆單元用0,通道單元用1 如果能夠通過繼續前進,如果不能通過則退回到上乙個單元,因此用棧來儲存通過的路徑 用0,1,2,3來分別表示4個方向 include pch.h include include include in...

棧實現迷宮求解問題

總體感觸是 不要著急,一步一步來,問題很容易解決的。首先是要實現乙個迷宮的地圖。明確如何儲存地圖,用vector實現二維陣列,每個元素代表地圖的乙個格仔。需要儲存哪些資訊。一張地圖的某乙個方格需要標示 能否通過,是否走過了。94 struct point 位置資訊可用postype儲存。就是 str...

利用棧求解迷宮問題

利用棧求解迷宮問題 源 include include define m 8 define n 8 define maxsize m n typedef struct box typedef struct sttype int mg m 2 n 2 bool mgpath int xi,int yi...