1215 迷宫
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。
输入描述 Input Description
输入的第一行为一个整数m,表示迷宫的数量。
其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。
输出描述 Output Description
输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO。
样例输入 Sample Input
1
7
s...##.
.#.....
.......
..#....
..#...#
###...#
......e
样例输出 Sample Output
YES
思路:深搜。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int map[20][20]; 5 int d[5]={0,1,0,-1,0}; 6 int n,m; 7 char s; 8 void dfs(int a,int b) 9 { 10 if(a==m&&b==m)return ; 11 for(int i=0;i<4;++i) 12 { 13 int h=a+d[i]; 14 int z=b+d[i+1]; 15 if((h<=m)&&(h>0)&&(z>0)&&(z<=m)&&map[h][z]==0) 16 { 17 map[h][z]=1; 18 dfs(h,z); 19 } 20 } 21 } 22 int main() 23 { 24 cin>>n; 25 while(n--) 26 { 27 memset(map,0,sizeof(map)); 28 cin>>m; 29 for(int i=1;i<=m;++i) 30 { 31 for(int j=1;j<=m;++j) 32 { 33 cin>>s; 34 if(s=='#')map[i][j]=1; 35 } 36 } 37 map[1][1]=1; 38 dfs(1,1); 39 if(map[m][m])cout<<"YES "; 40 else cout<<"NO "; 41 } 42 return 0; 43 }