链接: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
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
const int MAX=505;
int N,M;
char a[MAX][MAX];
int flag=0;
void dfs(int x,int y){
if(a[x][y]=='t'){ //能够踩到“t”表示走出了迷宫
flag=1; //标记flag为1
return;
}
a[x][y]='x';
int nx,ny;
for(nx=x-1,ny=y;nx<=x+1;nx+=2)
if(0<=nx&&nx<N&&0<=ny&&ny<M&&a[nx][ny]!='x') //上下左右四方搜索
dfs(nx,ny);
for(nx=x,ny=y-1;ny<=y+1;ny+=2)
if(0<=nx&&nx<N&&0<=ny&&ny<M&&a[nx][ny]!='x')
dfs(nx,ny);
}
int main(){
int p,q,t;
scanf("%d",&t);
while(t--){
flag=0;
scanf("%d%d",&N,&M);
for(p=0;p<N;p++){
for(q=0;q<M;q++){
cin>>a[p][q];
}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(a[i][j]=='s') //从“s”开始搜
{
dfs(i,j);
}
}
}
if(flag){
puts("YES");
}
if(!flag){
puts("NO");
}
}
return 0;
}