深度優先搜索---迷宮問題(最短路徑長度)


題目:

  給定一個 n x m大小的迷宮,其中 “*” 代表不可通過的牆壁,而 ’.‘代表平地,S表示起點,T表示終點。移動過程中,如果當前位置是(x,y)(下標從0開始),且每次只能往上下左右四個方向的平地移動,求從起點S到達終點T的最少步數

.....

.*.*.

.*S*.

.***.

...T*

在上面的樣例中,S的坐標為(2,2),T的坐標為(4,3)。

輸入格式:

 第一行給出m,n,表示迷宮的行,列;

 下面每一行給出 n個字符,共 m行;

最后一行給出起點坐標S1,S2,終點坐標T1,T2。

輸出格式:

輸出從起點S到達終點T的最少步數, 不存在輸出 -1。

輸入樣例 1:

5 5 

.....

.*.*.

.*S*.

.***.

...T*

2 2 4 3

輸出樣例 1:

11

輸入樣例 2:

5 5

.....

.*.*.

.*S*.

.***.

...T.

2 2 4 3

輸出樣例 2:

9

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 30;
 6 int m,n,MIN = 0x3fffffff;
 7 int S1,S2,T1,T2;
 8 char maze[maxn][maxn];
 9 
10 void DFS(int i,int j,int length) {
11     if(i < 0 || j < 0 || i>= m || j>= n || maze[i][j] == '*')//下標不能越過矩陣邊界,或者碰到障礙物 ---遞歸邊界
12         return ;
13     if(i == T1 && j == T2) {
14         MIN = min(MIN,length);//到達終點,更新最短路徑長度
15         return ;
16     }
17     maze[i][j] = '*';//四個方向作為選擇分支 
18     DFS(i,j+1,length +1);
19     DFS(i,j-1,length +1);
20     DFS(i+1,j,length +1);
21     DFS(i-1,j,length +1);
22     maze[i][j] = '.';//四個方向都找完了,由“*”恢復“.”,退回上一步 
23 }
24 
25 int main() {
26     cin>>m>>n;
27     for(int i = 0; i < m; ++i) {//初始化迷宮
28         for(int j = 0; j < n; ++j)
29             cin>>maze[i][j];
30     }
31     cin>>S1>>S2>>T1>>T2;//起點(S1,S2)和終點(T1,T2)
32     DFS(S1,S2,0);
33     cout<<MIN;
34     return 0;
35 }

運行結果 1:

 

 運行結果 2:

 

運行結果 3:

 ps:DFS暴力大法好!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM