wyh的迷宫(水题)
题目描述
给你一个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
简单的Bfs,不说啥直接上代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 550;
char map[maxn][maxn];
int vis[maxn][maxn];
int n,m;
int k[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int x1,y3,x2,y2;
struct node
{
int x,y;
node(int _x,int _y)
{
x = _x;
y = _y;
}
};
int bfs()
{
queue<node>que;
que.push(node(x1,y3));
vis[x1][y3] = 1;
while(!que.empty())
{
node q = que.front();
que.pop();
for(int i = 0;i<4;i++)
{
node v = q;
v.x += k[i][0];
v.y += k[i][1];
if(v.x==x2 && v.y == y2) return 1;
if(map[v.x][v.y] == '.' && !vis[v.x][v.y] &&v.x>=0&&v.y<m&&v.x<n&&v.y>=0)
{
vis[v.x][v.y] = 1;
que.push(node(v.x,v.y));
}
}
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
getchar();
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j] == 's')
{
x1 = i;
y3 = j;
}
else if(map[i][j] == 't')
{
x2 = i;y2 = j;
}
}
getchar();
}
memset(vis,0,sizeof(vis));
int ans = bfs();
if(ans) printf("YES\n");
else printf("NO\n");
}
return 0;
}
在牛客网上用y1编译过不去,所以我用了y3代替;
题目链接点击打开链接