2753 走迷宫
- 描述
- 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。 - 输入
- 第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用'.'表示,有障碍物的格子用'#'表示。
迷宫左上角和右下角都是'.'。 - 输出
- 输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
- 样例输入
-
5 5 ..### #.... #.#.# #.#.# #.#..
- 样例输出
-
9
1 #include "bits/stdc++.h" 2 3 using namespace std; 4 const int maxN = 110 ; 5 const int INF = 2147483647 ; 6 const int dx [ ] = { 1 , -1 , 0 , 0 } ; 7 const int dy [ ] = { 0 , 0 , -1 , 1 } ; 8 typedef long long QAQ ; 9 10 int r , c , ans = INF ; 11 12 char mp[ maxN ][ maxN ] ; 13 bool vis[ maxN ][ maxN ] ; 14 15 void DFS ( const int xi , const int yi , const int step ) { 16 if ( mp[ xi ][ yi ] == '#' || step > ans ) return ;//当当前答案比已有答案差,不再继续搜索 17 if( xi == r && yi == c ) { 18 ans = min ( ans , step ) ; 19 return ; 20 } 21 for(int i = 0; i < 4; ++i ) { 22 int xx = xi + dx [ i ] ; 23 int yy = yi + dy [ i ] ; 24 if ( !vis[ xx ][ yy ] && mp[ xx ][ yy ] == '.' ) { 25 26 vis[ xx ][ yy ] = true ; 27 DFS( xx , yy , step + 1 ) ; 28 vis[ xx ][ yy ] = false ; 29 } 30 } 31 } 32 33 void Init ( ){ 34 for ( int i=0 ; i<=r+1 ; ++i ) 35 for ( int j=0 ; j<=c+1 ; ++j ) 36 if ( i==0 || i == r+1 || j==0 || j== c+1 ) mp[ i ][ j ] = '#' ; 37 } 38 39 int main ( ) { 40 scanf ( "%d%d" , &r , &c ) ; 41 Init ( ); 42 getchar ( ) ; 43 for ( int i=1 ; i<=r ; ++i ){ 44 for ( int j=1 ; j<=c ; ++j ) { 45 mp[ i ][ j ] = getchar ( ) ; 46 } 47 getchar ( ) ; 48 } 49 50 vis[ 1 ][ 1 ] = true; 51 DFS ( 1 , 1 , 1 ) ; 52 cout << ans << endl ; 53 return 0; 54 }
2016-10-18 18:20:22
(完)