深度優先搜尋dfs求解迷宮問題
找到迷宮的可行路徑的座標,這是乙個搜尋遍歷問題。
實現思路:
可行的路徑儲存在路徑向量p中,從當前點尋找可行方向,如果可行則next入棧,不行則出棧退回前一點。
搜尋可行路徑的**:
while
(!p.
empty()
);//下乙個點
++p.
back()
.direction;
if(maze[next.x]
[next.y]
== unvisited)
//未被訪問);
//放進路徑裡
if(next.x == destination.x&&next.y == destination.y)
//到達終點
break;}
}else
p.pop_back()
;//,點無路可走時,出棧返回上乙個點
}
座標軸:假定朝下為x軸正方向,朝右為y軸正方向
這裡可以移動方向分為上下左右四種(d=4)情況,它們相對於當前點的方向偏移量如下:
右:下:
左:上:
構成方向向量:以下標取值0, 1, 2, 3標記右,下,左,上與當前點的偏移量.
point delta[d]=,,,};
舉例子:delta[0]表示向右走,delta[1]表示向下走。
下個點next表示為:當前點的位置座標+偏移量
point next=
;//下乙個點
完整**:
#include
"pch.h"
#include
#include
using
namespace std;
//點座標
struct point
;//狀態:點座標+方向
struct status
;int
main()
,,,,
};const
char visited =
'v';
//訪問過的標記
const
char unvisited =
'0';
//未訪問過的標記
//可行的方向數目0,1,2,3分別代表東南西北方向和當前位置的偏移量
const
int d =4;
const point delta[d]=,
,,};
//起點和終點座標
point source =
; point destination =
; vector p;
//搜尋時儲存路徑所用的向量,可視為棧;
p.reserve
(m*n)
;//提前預留容量;
p.push_back()
;//設定初始位置,並設定初始方向;
maze[source.x]
[source.y]
= visited;
//起點定為已經訪問
while
(!p.
empty()
);//下乙個點
++p.
back()
.direction;
if(maze[next.x]
[next.y]
== unvisited)
//未被訪問);
//放進路徑裡
if(next.x == destination.x&&next.y == destination.y)
//到達終點
break;}
}else
p.pop_back()
;//,點無路可走時,出棧返回上乙個點
} cout <<
"迷宮圖如下:"
<< endl;
//print the maze
for(size_t i =
0; i < m;
++i)
for(size_t j =
0; j < n;
++j)
//列印路徑
cout <<
"可行座標路徑為:"
<< endl;
for(
const
auto
& c : p)
cout << c.pt.x <<
" "<< c.pt.y << endl;
return0;
}
測試結果:
DFS解迷宮問題(Go實現)
首先設定乙個地圖,s為起點,e為終點,為牆。定義個棧一般的路徑。開始遞迴 將旁邊的座標加入路徑 第一次為s所在的位置 判斷是否越界 重複 撞牆,若是則返回false到上次遞迴 判斷是否到達終點,若是則返回true到上次遞迴 若上述判斷均否,開始下一次遞迴,取得返回值 若得到的返回值均為false,說...
迷宮問題 棧的應用
問題描述 以m n的矩陣表示迷宮圖,數字0代表通路,數字1代表障礙。對於走過的路徑,將數字0替換為數字2,便於檢視通路路徑。計算機解迷宮通常用的是 窮舉求解 方法,即從入口出發,順著某乙個方向進行探索,若能走通,則繼續往前進 否則沿著原路退回 回溯 換乙個方向繼續探索,直至出口位置,求得一條通路。注...
棧的應用 迷宮問題
include define maxsize 100 typedef struct box typedef struct sttype bool mgpath int mg 10 10 int xi,int yi,int xe,int ye 求解路徑為 xi,yi xe,ye int main if...