乙個簡單的迷宮演算法

2021-12-30 01:08:12 字數 1635 閱讀 4200

迷宮問題的求解是乙個典型的問題,那仫如何找到迷宮的出口?在遇到死胡同的時候如何返回?如何防止走重複的路程?這就是我們要解決的問題了.

要列印乙個簡單的迷宮,我們理所當然的想到了利用二維陣列,在迷宮的實現中我定義了乙個mazemap.txt的檔案用來儲存迷宮,在初始化的時候只需要將該迷宮從mazemap.txt中讀出來就可以了.

0-路1-牆

(1).如果當前路徑已經走過則要留下標記;如果走到死胡同也要留下標記,但是要體現回溯,所以這兩種情況的標記最好不同

(2).找迷宮路徑的可通路可理解為使用試探法.

即在乙個結點的上,下,左,右四個方向進行試探,如果某乙個方向滿足迷宮位置要求則將該位置壓棧;如果走到死胡同此時該位置的四個方向都不可通(之前已經將走過的路標記為2),我們只需要將該位置出棧即可.

(3).判斷是否走出迷宮.

因為迷宮的出口只可能在邊界,我們可以認為三個方向都可能存在出口.所以在判斷是否走出迷宮的時候,我們可以在除了入口的那一面都進行判斷.

迷宮問題也是棧的應用場景之一

在迷宮中用到的棧是我自己寫的.

template

class stack

~stack()

_size=0;

_capacity=0;

} void push(const t& x)

void pop()

bool empty()

t& top()

size_t size()

protected:

void _checkcapacity()

int _row; //行

int _col; //列

};void initmaze(int *mz)

return false; //不可通路

}bool findpath(int *mz,int rows,int cols,stack& s,pos enter)

//上next._row -= 1;

if(checkreason((int *)mz,next))

next._row += 1;

//右next._col += 1;

if(checkreason((int *)mz,next))

next._col -= 1;

//左next._col -= 1;

if(checkreason((int *)mz,next))

next._col += 1;

//下next._row += 1;

if(checkreason((int *)mz,next))

next._row -= 1;

mz[cur._row*cols+cur._col]=3; //體現回溯

s.pop();

} return false;

}void printmaze(int *mz)

{ for(size_t i=0;i 在此迷宮問題中可以找到走出此迷宮的最優路徑,在這裡用到圖的廣度優先可以解決...

寫乙個簡單的迷宮

二話不說 上迷宮 include include define number 13 int fx 4 int fy 4 void prin char arr number 列印 bool work char arr number int x,int y 判斷是否可以走 bool mymap char...

乙個簡單的洗牌演算法

首先我們需要寫乙個 生成指定區間內的隨機數 的函式 因為陣列索引都是整數,所以我們需要對隨機的結果再向下取整 返回乙個 min,max 之間的隨機數 function getrandomint min,max math.random 會生成乙個 0,1 之間的number 然後我們需要遍歷陣列,對每...

乙個走迷宮的程式

本文給出乙個c語言版的走迷宮的程式。迷宮的寬和高,迷宮矩陣,迷宮的入口和出口從檔案讀入。程式首先讀入迷宮資料,然後顯示迷宮矩陣,最後呼叫迷宮搜尋程式找到乙個路徑,並輸出。1.迷宮的表示。迷宮用結構體matrix來表示 包括迷宮矩陣 迷宮的寬,迷宮的高,迷宮入口的座標,迷宮出口的座標。結構體定義如下 ...