zcmu-1185: 走迷宮(dfs經典題)
阿新 • • 發佈:2018-11-24
1185: 走迷宮
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 379 Solved: 153
[Submit][Status][Web Board]Description
給一張個迷宮,問能否從起點走到終點,只能往上下左右走,不能斜著走
Input
多組測試資料,每組第一行兩個正整數,分別為n和m
表示n這個迷宮有n行m列(0<n,m<10)
接著是n行m列,
'#'表示路
‘*’表示牆
‘S’表示起點
‘T’表示終點
Output
每組測試資料輸出一個結果,如果能從S走到T,輸出“YES”,否則輸出“NO”
Sample Input
2 2 S* #T 3 3 S*# #*T ##*
Sample Output
YES NO
n,m邊界那裡糾結了很久,還去問了同學,其實畫一下就好了哈哈哈笨呆了
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <list> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <iostream> #define mem(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; char c[15][15]; int flag = 0,n,m; //往上、下、左、右走的時候x,y座標的變化 int dx[] = {0,0,-1,1}; int dy[] = {-1,1,0,0}; int vis[15][15]; void dfs(int x,int y) { vis[x][y] = 1; if(c[x][y] == 'T')//搜到了就停了 { flag = 1; return; } for(int i = 0; i < 4;i++)//沒搜到,就繼續往四個方向搜 { int x1 = x + dx[i]; int y1 = y + dy[i]; if(x1 >= 0 && y1 >= 0 && x1 < m && y1 < n && !vis[x1][y1] && c[x1][y1] != '*')//這裡不能寫 == ‘#’,我剛開始寫錯了,而且把x1,y1的範圍nn,m弄反了 dfs(x1,y1); } } int main() { while(scanf("%d%d",&n,&m) != EOF) { int sx,sy; flag = 0; mem(vis); for(int i = 0;i < n;i ++) { getchar();//別忘記這個 scanf("%s",c[i]); } for(int i = 0;i < n;i++) { for(int j = 0;j <m;j++) { if(c[i][j] == 'S') { sx = i; sy = j; break; } } } dfs(sx,sy); printf(flag ? "YES\n":"NO\n"); } return 0; }