码迷,mamicode.com
首页 > 其他好文 > 详细

bnu 51641 Certain Maze(bfs)(北师16校赛)

时间:2016-04-26 20:50:08      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

最近,无聊的过河船同学发现了一种无聊的迷宫生成算法。

算法过程如下: 一个技术分享的矩形区域可以看作技术分享个单位网格组成。在每个网格中,随机生成一个从右上角到左下角的L型障碍或者从左上角到右下角的R型障碍(障碍可以被看作一条线段)。

技术分享

图1:两种障碍

这样便可以生成一个大小为技术分享的迷宫,如图2所示。

技术分享

图2:无聊的迷宫

然后过河船同学想知道,是否存在迷宫内的从迷宫上边界到达迷宫的下边界的路径。于是无聊的过河船同学花了一夜的时间,终于找到一条路径。

技术分享

图3:过河船同学辛辛苦苦找到的道路

痛苦的过河船同学不想再伤害自己的眼睛,他想直接知道,对于给定的迷宫,是否存在这样的路径。

请注意,路径只能从迷宫内部穿过,除起点和终点外不得离开迷宫区域。

Input

第一行是一个正整数技术分享,表示测试数据的组数,

对于每组测试数据,

第一行是两个整数技术分享技术分享,表示迷宫的行数和列数,

接下来技术分享行,每行是一个长为技术分享的只包含‘L‘和‘R‘的字符串,‘L‘表示一个L型障碍,‘R‘表示一个R型障碍。

Output

对于每组测试数据,如果存在一条可以从迷宫的上边界到达迷宫的下边界的路径,输出"Yes"(不含引号),否则输出"No"(不含引号)。

Sample Input

2
2 2
LR
LR
2 2
LL
RR

Sample Output

No
Yes

Hint

样例中的迷宫形状分别为:

技术分享

Source

Author

zhan723284893

题目大意:

       给定一个迷宫,迷宫的墙都是格子的对角线,问是否能从迷宫上边界走到迷宫下边界。
题目解法:

      每个格子选出四个关键点,两种墙分别对应两种关键点之间的连边方式,建出图之后跑一遍BFS或者用并查集维护连通性均可,复杂度O(n^2)或者O(n^2*ɑ(n))或者O(n^2*logn),总之都能过。

(队友写的,码力好强!)

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#define C(a) memset(a,0,sizeof a)
#define C_1(a) memset(a,-1,sizeof a)
#define C_I(a) memset(a,0x3f,sizeof a)
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 120;
int n, m;
char ma[maxn][maxn];
bool vis[maxn][maxn][3];
struct node
{
	int x, y, f;
	node(int a, int b, int c)
	{
		x = a; y = b; f = c;
	}
};
int main()
{
	int T; cin >> T;
	while (T--)
	{
		C(vis);
		scanf("%d%d", &n, &m);
		for (int i = 0; i<n; i++)scanf("%s", ma[i]);
		queue<node> q;
		for (int i = 0; i<m; i++) {
			q.push(node(0, i, 0));
			vis[0][i][0] = 1;
		}
		int X, Y, F, x, y, f;
		int flag = 0;
		while (!q.empty())
		{
			x = q.front().x;
			y = q.front().y;
			f = q.front().f;
			//printf("%d %d %d\n",x,y,f);
			if (x == n - 1 && f == 1)
			{
				flag = 1;
				break;
			}
			q.pop();
			if (f == 0 && ma[x][y] == 'R')
			{
				X = x - 1;
				Y = y;
				F = 1;
				if (X<0 || X >= n || Y<0 || Y >= m || vis[X][Y][F]);
				else {
					q.push(node(X, Y, F));
					vis[X][Y][F] = 1;
				}
				X = x; Y = y + 1;
				if (X<0 || X >= n || Y<0 || Y >= m);
				else
				{
					if (ma[X][Y] == 'L')
					{
						F = 0;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
					else {
						F = 1;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
				}
			}
			else if (f == 0 && ma[x][y] == 'L') {
				X = x - 1;
				Y = y;
				F = 1;
				if (X<0 || X >= n || Y<0 || Y >= m || vis[X][Y][F]);
				else {
					q.push(node(X, Y, F));
					vis[X][Y][F] = 1;
				}
				X = x; Y = y - 1;
				if (X<0 || X >= n || Y<0 || Y >= m);
				else
				{
					if (ma[X][Y] == 'L')
					{
						F = 1;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
					else {
						F = 0;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
				}
			}
			else if (f == 1 && ma[x][y] == 'L') {
				X = x + 1;
				Y = y;
				F = 0;
				if (X<0 || X >= n || Y<0 || Y >= m || vis[X][Y][F]);
				else {
					q.push(node(X, Y, F));
					vis[X][Y][F] = 1;
				}
				X = x; Y = y + 1;
				if (X<0 || X >= n || Y<0 || Y >= m);
				else
				{
					if (ma[X][Y] == 'L')
					{
						F = 0;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
					else {
						F = 1;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
				}
			}
			else if (f == 1 && ma[x][y] == 'R') {
				X = x + 1;
				Y = y;
				F = 0;
				if (X<0 || X >= n || Y<0 || Y >= m || vis[X][Y][F]);
				else {
					q.push(node(X, Y, F));
					vis[X][Y][F] = 1;
				}
				X = x; Y = y - 1;
				if (X<0 || X >= n || Y<0 || Y >= m);
				else
				{
					if (ma[X][Y] == 'L')
					{
						F = 1;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
					else {
						F = 0;
						if (vis[X][Y][F]);
						else {
							q.push(node(X, Y, F));
							vis[X][Y][F] = 1;
						}
					}
				}
			}
		}
		if (flag)printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}


bnu 51641 Certain Maze(bfs)(北师16校赛)

标签:

原文地址:http://blog.csdn.net/chat_c/article/details/51244811

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!