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代替;

题目链接点击打开链接

posted @ 2018-04-07 12:43  Nlifea  阅读(251)  评论(0编辑  收藏  举报