迷宮問題的求解是乙個典型的問題,那仫如何找到迷宮的出口?在遇到死胡同的時候如何返回?如何防止走重複的路程?這就是我們要解決的問題了.
要列印乙個簡單的迷宮,我們理所當然的想到了利用二維陣列,在迷宮的實現中我定義了乙個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來表示 包括迷宮矩陣 迷宮的寬,迷宮的高,迷宮入口的座標,迷宮出口的座標。結構體定義如下 ...