链接:
https://www.nowcoder.com/acm/contest/93/D
来源:牛客网
就是走迷宫,很好理解。注意YES跟NO是全大写的就行了。
来源:牛客网
题目描述
给你一个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 <cstring>
#include <queue>
using namespace std;
struct coordinate{
int x,y;
}now,fresh;
char a[501][501];
int sx,sy,tx,ty,t,n,m;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int vis[501][501];
void dfs(int x,int y){
memset(vis,0,sizeof(vis));
queue<coordinate> s;
now.x=x;
now.y=y;
vis[x][y]=1;
s.push(now);
while(!s.empty()){
now=s.front();
s.pop();
for(int i=0;i<4;i++){ //四个方向走
fresh.x=now.x+dx[i];
fresh.y=now.y+dy[i];
while(1){
if(fresh.x>=0&&fresh.x<n&&fresh.y>=0&&fresh.y<m&&a[fresh.x][fresh.y]!='x'){
if(fresh.x==tx&&fresh.y==ty){
cout<<"YES"<<endl;
return ;
}
if(vis[fresh.x][fresh.y]==0){
vis[fresh.x][fresh.y]=1;
s.push(fresh); //将没有走完四个方向的放进队列里
}
fresh.x+=dx[i];
fresh.y+=dy[i];
}
else break;
}
}
}
cout<<"NO"<<endl;
}
int main()
{
// ios::sync_with_stdio(false);
int t;
cin>>t;
// scanf("%d",&t);
while(t--){
cin>>n>>m;
// scanf("&d%d",&n,&m);
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
// scanf("%c",&a[i][j]);
if(a[i][j]=='s'){
sx=i;sy=j;
}
if(a[i][j]=='t'){
tx=i;ty=j;
}
}
getchar();
}
dfs(sx,sy);
}
return 0;
}