題目:
給定一個 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暴力大法好!