2018年东北农业大学春季校赛 D wyh的迷宫【搜索】
链接:https://www.nowcoder.com/acm/contest/93/D
来源:牛客网
题目描述
给你一个n*m的迷宫,这个迷宫中有以下几个标识:
s代表起点
t代表终点
x代表障碍物
.代表空地
现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动,并且不能移动到已经移动过的点)。
输入描述:
输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,对于每一组测试数据,第一行输入2个数n和m(1<=n,m<=500)
接下来n行,每行m个字符代表这个迷宫,每个字符都是上面4个中的一种
数据保证只有一个起点和一个终点
输出描述:
对于每一组测试数据,如果可以的话输出YES,不可以的话输出NO
示例1
输入
1 3 5 s...x x...x ...tx
输出
YES
【分析】:判断地图可达性。可以DFS搜索看是否可以到达终点,某点a[x][y] == 't'(终点) or v[ex][ey]==1(终点坐标) 就说明可以,输出YES
【代码】:
#include<bits/stdc++.h> using namespace std; #define ll long long #define N 550 int t; char a[N][N]; int dx[] = {1, 0, -1, 0}; int dy[] = {0, -1, 0, 1}; int v[N][N]; int f; int n, m; int ok(int tx, int ty) { if(tx>=0 && tx<n && ty>=0 && ty<m && a[tx][ty]!='x' && v[tx][ty] == 0) return 1; else return 0; } void dfs(int x, int y) { v[x][y] = 1; if(a[x][y] == 't'){ f = 1; return ; } for(int i=0; i<4; i++){ int x1 = x + dx[i]; int y1 = y + dy[i]; if(ok(x1,y1)) dfs(x1,y1); } } int main() { int t, sx, sy; scanf("%d", &t); while(t--) { f = 0; scanf("%d %d", &n, &m); memset(v, 0, sizeof(v)); for(int i = 0; i < n; i++) { scanf("%s", a[i]); } for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(a[i][j] == 's') { sx = i; sy = j; break; } } } dfs(sx, sy); if(f == 1) printf("YES\n"); else printf("NO\n"); } return 0; } /* 1 3 5 s...x x...x ...tx */