深搜即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500+10;
char a[maxn][maxn];
int begin_x, begin_y;
int end_x, end_y;
int n, m;
bool vis[maxn][maxn];
bool flag = false;
//对于上下左右的移动提前打表
int mv[4][2] = {
{-1, 0},
{1, 0},
{0, -1},
{0, 1}
};
void dfs(int x, int y) {
vis[x][y] = true;
if (x>n||y>m||x<=0||y<=0) return ;
if (x==end_x&&y==end_y) {
flag=true;
return ;
}
//进行上下左右的移动
for (int i=0;i<4;i++) {
int next_x = x+mv[i][0];
int next_y = y+mv[i][1];
if (!vis[next_x][next_y]&&a[next_x][next_y]!='x') {
dfs(next_x, next_y);
}
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
flag = false;
memset(vis, 0, sizeof(vis));
scanf("%d %d ", &n, &m);
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
scanf("%c", &a[i][j]);
if (a[i][j]=='s') begin_x=i, begin_y=j;
if (a[i][j]=='t') end_x=i, end_y=j;
}
getchar();
}
dfs(begin_x, begin_y);
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}

京公网安备 11010502036488号