首先來(lái)看一下迷宮簡(jiǎn)易圖
????????????????????????????
????我們用 0 來(lái)表示該位置是墻, 用 1 來(lái)表示該位置是路. 所以, 我們?cè)谔幚砻詫m問(wèn)題的時(shí)候可以將其看成一個(gè)二維數(shù)組即可, 而對(duì)應(yīng)的每一條路我們可以用坐標(biāo)的形式將其表示, 所以還需要有一個(gè)結(jié)構(gòu)體來(lái)描述對(duì)應(yīng)的點(diǎn)的
1. 相關(guān)數(shù)據(jù)結(jié)構(gòu)
typedef struct Maze
{
int map[MAX_ROW][MAX_COL];
}Maze;
typedef struct Point
{
int row;
int col;
}Point;
2.迷宮初始化
????所謂的初始化迷宮就是將這個(gè)二維數(shù)組初始化, 我們自己定義一個(gè)二維數(shù)組, 然后將其每一個(gè)值賦值給我們的迷宮地圖即可
void MazeInit(Maze* maze)
{
if(maze == NULL){
return;}
int Map[MAX_ROW][MAX_COL] = {{
0,
1,
0,
0,
0,
0},{
0,
1,
0,
0,
0,
0},{
0,
1,
0,
0,
0,
0},{
0,
1,
1,
1,
1,
0},{
0,
0,
0,
1,
1,
0},{
0,
0,
0,
1,
0,
0}};
int row =
0;
int col =
0;
for(; row < MAX_ROW; row++){
for(col =
0; col < MAX_COL; col++){maze ->
map[row][col] = Map[row][col];}}
}
3.迷宮探索
????迷宮探索即就是從給出的迷宮入口開(kāi)始, 一直往后探索, 直到找到出口為止. 我們利用函數(shù)在遞歸的過(guò)程中會(huì)形成棧楨的特性, 依次將我們所探索的為位置進(jìn)行壓棧, 在此過(guò)程中, 我們必須得判斷當(dāng)前的點(diǎn)是否合法, 同時(shí)必須判斷當(dāng)前的點(diǎn)是否可以落腳, 如果可以落腳, 就現(xiàn)將該位置標(biāo)記, 然后判斷當(dāng)前位置是否是出口, 如果是出口, 說(shuō)明迷宮探索完畢, 如果不是出口, 那么我們就得必須找下一個(gè)可以落腳的位置, 即我們依次按照順時(shí)針的方向依次遍歷當(dāng)前位置四周的四個(gè)點(diǎn)(up, rught, down, left), 只要我們發(fā)現(xiàn)有一個(gè)點(diǎn)可以落腳, 我們就將當(dāng)前位置對(duì)應(yīng)的點(diǎn)入棧(調(diào)用函數(shù)本身), 當(dāng)四個(gè)方向都已經(jīng)走完了, 那么我們就得往回退, 即就是對(duì)應(yīng)的出棧過(guò)程了.具體如下圖
????????????????????????????????????
void _GetPath(Maze* maze, Point cur, Point entry)
{
if(maze == NULL){
return;}
if(cur.row <
0 || cur.row >= MAX_ROW || cur.col <
0 || cur.col > MAX_COL){
return;}
if(entry.row <
0 || entry.row >= MAX_ROW || entry.col <
0 || entry.col >= MAX_COL){
return;}
printf(
"(%d, %d)\n", cur.row, cur.col);
if(CanStay(maze, cur)){Mark(maze, cur);
if(IsExit(maze, cur, entry)){
printf(
"找到了一條路\n");
return;}Point up = cur;up.row -=
1;_GetPath(maze, up, entry);Point right = cur;right.col +=
1;_GetPath(maze, right, entry);Point down = cur;down.row +=
1;_GetPath(maze, down, entry);Point left = cur;left.col -=
1;_GetPath(maze, left, entry);}
else{
return;}
}
void GetPath(Maze* maze, Point entry)
{
if(maze == NULL){
return;}
if(entry.row <
0 || entry.row >= MAX_ROW || entry.col <
0 || entry.col >= MAX_COL){
return;}_GetPath(maze, entry, entry);MazePrint(maze);
}
4.判斷是否可以落腳
???? 即先判斷迷宮數(shù)據(jù)結(jié)構(gòu)是否輸入合法, 接下來(lái)就是判斷當(dāng)前位置是否合法, 如果不合法就退出, 如果當(dāng)前位置對(duì)應(yīng)的值是 1, 則說(shuō)明能落腳, 否則就說(shuō)明不能落腳.
int CanStay(Maze* maze, Point cur)
{
if(maze == NULL){
return 0;}
if(cur.row <
0 || cur.row >= MAX_ROW || cur.col <
0 || cur.col >= MAX_COL){
return 0;}
if(maze ->
map[cur.row][cur.col] ==
1){
return 1;}
return 0;
}
5.判斷出口
????如果該位置到達(dá)迷宮邊界, 并且不等于入口位置, 則說(shuō)明到達(dá)出口
int IsExit(Maze* maze, Point cur, Point entry)
{
if(maze == NULL){
return 0;}
if(cur.row == entry.row && cur.col == entry.col){
return 0;}
if(cur.row == MAX_ROW -
1 || cur.row ==
0 || cur.col ==MAX_COL -
1 || cur.col ==
0){
return 1;}
return 0;
}
6.標(biāo)記
????將當(dāng)前位置的值賦值為2
void Mark(Maze* maze, Point cur)
{
if(maze == NULL){
return;}
if(cur.row <
0 || cur.row >= MAX_ROW || cur.col <
0 || cur.col >= MAX_COL){
return;}maze ->
map[cur.row][cur.col] =
2;
}
7.打印迷宮函數(shù)
void MazePrint(Maze* maze)
{
if(maze == NULL){
return;}
int row =
0;
int col =
0;
for(; row < MAX_ROW; row++){
for(col =
0; col < MAX_COL; col++){
printf(
"%2d ", maze ->
map[row][col]);}
printf(
"\n");}
}
????依次將回溯點(diǎn)打印出來(lái),運(yùn)行結(jié)果如圖
????????????????????????????????
總結(jié)
以上是生活随笔為你收集整理的迷宫求解(递归)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。