迷宮問題(棧)

2021-07-16 09:38:30 字數 2230 閱讀 3415

"迷宮問題(棧)"

「棧」是一種簡單的資料結構,它的主要特點就是"先進後出",即就是先壓入棧中的資料需要最後出棧。相當於棧是乙個杯子,最先放進棧中的東西,只能夠最後拿出來。下面對「棧」的特點用圖形象的表示出來。

這次所要討論的是基於棧的迷宮問題,當給定乙個迷宮,我們怎樣能夠找出迷宮中的通道呢?如果迷宮的規模比較大,我們又該如何去實現呢?我們能夠明顯的知道需要使用乙個二維陣列用來儲存迷宮,但是當迷宮的規模比較大時,或者是當我們想要頻繁的去更改所設計的迷宮時,用二維陣列的方式顯然是不大合理,程式更改會比較麻煩。

在這裡我採用「檔案」的方式將迷宮進行儲存,程式中只用實現讀取檔案的操作,這樣很便於以後對程式的維護。因為動態的給定迷宮大小,程式的實現還是較為麻煩的,這裡直接將迷宮的規模給定。用「1」來表示不能夠通過,「0」表示能夠通過。下面是迷宮的設計:

針對迷宮的特點,主要採用的方法是先將迷宮的入口點壓入棧中,在對這個點的上、下、左、右方向的節點進行判斷,看是否有能夠通過的節點(「0」),若沒有,則迷宮中沒有一條能夠通過的路徑,如果存在,則將這個節點也壓入棧中,迴圈這種方式,直到找到沒有能夠前進的點,此時就要進行「回溯」, 即就是倒回以前走過的點。進而在判斷有沒有剛才沒有走過的且能夠通過的節點,若存在,再次進行剛才的壓棧操作,直到走出迷宮,若回到迷宮的入口點,則迷宮中不存在通路。

根據上面的思路,編寫出下面的**:

檔案

#pragma once

#define max 10

#include #include //使用靜態陣列

struct pos     //標記點的位置座標

;void getmaze(int * arr, int n)      //從檔案中獲取迷宮}}

fclose(open);

}void print(int * arr, int n)      //列印迷宮

cout <

}}bool checkisaccess(int * arr, int n, const pos& next)  //檢查迷宮節點的下乙個路徑上的節點

return false;

}//entry 為入口的位置,paths用來儲存迷宮的通路

//判斷迷宮中是否存在一條通路

bool searchmazepaths(int * arr, int n, pos entry, stack& paths)  

pos next = cur;

//上next._row--;

if (checkisaccess(arr, n, next))

//下next = cur;

next._row++;

if (checkisaccess(arr, n, next))

//左next = cur;

next._col--;

if (checkisaccess(arr, n, next))

//右next = cur; 

next._col++;

if (checkisaccess(arr, n, next))

paths.pop();     //若節點的剩餘方向都不能通過,則進行回溯。}}

檔案

#define _crt_secure_no_warnings 1

//使用棧來設計迷宮問題

#include using namespace std;

#include #include "memory.h"

int main()

;    stackpaths;

pos tmp;

tmp._row = 2;

tmp._col = 0;

getmaze((int*)arr, max);

print((int*)arr, max);

cout <

int ret = searchmazepaths((int *)arr, max, tmp, paths);

printf("能否有一條通路:%d\n\n\n", ret);

print((int*)arr, max);

system("pause");

return 0;

}

棧求解迷宮問題

問題 假設下圖1是某迷宮的地圖 0代表路徑,1代表牆壁 問此迷宮是否有條通路?求解思想 用棧來實現解決問題,主要步驟是 1 將迷宮的入口座標設為當前座標 2 將當前座標壓棧,將當前座標上的值設為2 0變為2 代表已走過的路 3 判斷當前座標的四周 上下左右 是否是可以通 為0則通 的,如果是通的,那...

棧 求解迷宮問題

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

棧實現迷宮求解問題

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