解题步骤:DFS或者BFS裸题,记录好障碍和边界,然后从起点搜索判断能否走到终点
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 505;
const int dir[][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int n, m;
string mz[maxn];
bool flag = 0;
bool vis[maxn][maxn];
struct node {
int x, y;
};
bool check(node now) {
return now.x < 0 || now.x >= n || now.y < 0 || now.y >= m || vis[now.x][now.y];
}
void dfs(node now) {
if (check(now)) return;
vis[now.x][now.y] = 1;
if (mz[now.x][now.y] == 't') {
flag = 1;
return;
}
node nex = now;
for (int i = 0; i < 4; ++i) {
nex.x = now.x + dir[i][0], nex.y = now.y + dir[i][1];
dfs(nex);
}
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0);
int t;
cin >> t;
while (t--) {
memset(vis, 0, sizeof vis);
flag = 0;
cin >> n >> m;
for (int i = 0; i < n; ++i) {
cin >> mz[i];
for (int j = 0; j < m; ++j)
if (mz[i][j] == 'x') vis[i][j] = 1;
}
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
if (mz[i][j] == 's') {
dfs(node{i, j});
goto LOOP;
}
LOOP:
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
// system("pause");
return 0;
}
京公网安备 11010502036488号