【ACM】CODE[VS] 1215 (DFS)
阿新 • • 發佈:2018-11-19
題目描述 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
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 20; int vis[maxn][maxn],n,flag; char map[maxn][maxn]; int xx[5]={0,-1,1,0,0}; int yy[5]={0,0,0,-1,1}; void dfs(int x,int y) { int i; vis[x][y]=1; if(map[x][y]=='e') { flag=1; return ; } for(i=1;i<=4;i++) { if(x+xx[i]>=0 && x+xx[i]<n && y+yy[i]>=0 && y+yy[i]<n && map[x+xx[i]][y+yy[i]]!='#' && vis[x+xx[i]][y+yy[i]]==0) { dfs(x+xx[i],y+yy[i]); } /*把兩個if合併,時間更少 if(x+xx[i]>=0 && x+xx[i]<n && y+yy[i]>=0 && y+yy[i]<n ) { if( map[x+xx[i]][y+yy[i]]!='#' && vis[x+xx[i]][y+yy[i]]==0) dfs(x+xx[i],y+yy[i]); }*/ } } int main () { int T,i,j; cin>>T; while(T--) { cin>>n; memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map)); for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>map[i][j]; flag=0; dfs(0,0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }