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

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

算法过程如下: 一个的矩形区域可以看作个单位网格组成。在每个网格中,随机生成一个从右上角到左下角的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;
}
时间: 2024-08-10 13:10:12

bnu 51641 Certain Maze(bfs)(北师16校赛)的相关文章

bnu 51644 Whalyzh&#39;s Problem(网络流,最大密度图) (北师16校赛)

很久以前,当whalyzh同学是一个萌新的时候,遇到了这么一个问题: 给定长为的序列,构造一个只有0和1的长为的序列,使得的值最大. 小Q同学想了一秒钟之后说:这不是一眼题么?然后whalyzh同学瞬间就会了. 过了几天,当whalyzh同学还是一个萌新的时候,遇到了这么一个问题: 给定阶方阵,构造一个只有0和1的的向量,使得的值最大. 小Q同学想了一分钟之后说:这不是一眼题么?然后whalyzh同学瞬间就会了. 又过了几天,当whalyzh仍然是一个萌新的时候,遇到了这么一个问题: 给定阶方阵

bnu 51636 Squared Permutation(树状数组)(北师16校赛)

最近,无聊的过河船同学在玩一种奇怪的名为"小Q的恶作剧"的纸牌游戏. 现在过河船同学手有张牌,分别写着,打乱顺序之后排成一行,位置从左往右按照标号. 接下来小Q同学会给出个操作,分为以下两种: 1.给定,交换从左往右数的第和第张牌, 2.给定,对从左往右数的第张牌,记下位置是这张牌上的数字的牌的数字,询问所有记下的数字加起来的结果. 虽然无聊的过河船同学精通四则运算,但是要完成这么大的计算量还是太辛苦了,希望你能帮他处理这些操作. Input 第一行是一个正整数,表示测试数据的组数,

bnu 51638 Air Hockey(三分+二分)(北师16校赛)

无聊的过河船同学和无聊的胀鱼同学非常喜欢打桌上冰球(其实只是喜欢听球碰撞时的声音).在无聊的一天,无聊的过河船同学想到了一个无聊的玩法:两人同时将两个球放桌面上,同时击出,然后听两颗球撞在一起时的声音.然而他们都对击球的精确度把握得不是很好,所以这两颗球并不一定能相撞. 现在假设桌面无限大,并且绝对光滑,给出两球的初始位置.半径和运动速度,保证两球初始没有接触.无聊的过河船同学想知道两球能否相撞(接触即认为相撞),如果能,他想知道两球相撞的时间(从两人击球时开始计时),如果不能,他想知道全过程中

bnu 51640 Training Plan(类似区间dp)(北师16校赛)

小Q同学为了准备今年的ICPC Regional,计划在天之内刷掉道题,每道题有一个难度值,其中第道题的难度值为. 然而处于半颓废状态中的小Q同学不希望在同一天中做难度差距悬殊的题目,定义第天中刷的题的难度的最大值减最小值为(如果第天没有刷题,则),那么整个计划的难度为. 小Q同学可以按照任意的顺序刷题,并且一天中可以刷任意多道题,但是每道题只需要做一次,现在小Q同学想知道完成这个计划的总难度的最小值是多少. Input 第一行是一个正整数,表示测试数据的组数, 对于每组测试数据, 第一行是两个

四叠半神话大系(bfs序+st+在线倍增+二分)(北理16校赛)

时间限制1秒 内存限制64M 题目描述: 「我们大部分的烦恼,是来自于梦想另一种有可能的人生.把希望寄托于自己的可能性这种不能指望的东西,正是万恶的根源.」 时间突然停止. 我获得了可以在平行世界中穿梭的能力. 宇宙中存在着无数的平行世界,这些世界组成了一个树形的结构,每个世界有一个编号和一个幸福度. 每当我做出选择时,世界会分裂成若干个新的世界.选择会导致幸福度的变化.根据选择的不同,在新的世界里,我可能会变的更加幸福,或者更加不幸. 出于某些原因,我只能在处于相同时间的世界内穿梭,而且只能在

北工大2017校赛 1101:要打车的FanZzz

题目链接: http://bjutacm.openjudge.cn/lianxi/1101/ 思路: 二分 + 二分图最大匹配. 开始的时候我想直接用最小费用流模型,后来发现这样是错误的.因为这道题实际上是求一个匹配数>=n的匹配,并且满足在这个匹配中匹配边的最大的权值最小:而不是使所有匹配边的权值之和最小.这样看来就是一个典型的二分思路.首先对权值排序,每次选中原图中那些权值不能超过x的边,用这些边构建二分图.再用匈牙利算法check一下这个二分图的最大匹配数是否>=n.二分一下满足这样的条

POJ3026——Borg Maze(BFS+最小生成树)

Borg Maze DescriptionThe Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The Borg collective is the term used to describe the group consciousness of the Borg civilization. Each Borg individual is linked

14年广东省赛,北师邀请赛

特斯拉电动汽车联合创始人兼CEO,私人太空发射公司SpaceX CEO伊隆马斯克(Elon Musk)于5月16日在南加大商学院毕业典礼上发表演讲,他谈到了关于创业的几件重要的事情:一是努力工作;二是吸引优秀人才;三是将核心放在把产品和服务变得更好上;四是不要单一跟着大趋势走. 以下为Elon Musk演讲全文: 谢谢大家,我只有很短的几分钟,我会努力利用好这仅有的时间.在这里我想与大家分享四件重要的事情.其中一些听起来可能像名言警句,但是经历告诉我,它们确实实用. 第一点对于要创业的年轻人非常

poj 3026 Borg Maze (bfs + 最小生成树)

链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走),空格代表空位(可走),S代表搜索起点(可走) A代表外星人站(可走),现在要从S出发,将S和所有的A之间都连通,求路线总距离最小值 分析:可以先用bfs将所有的A,S两两之间的最短距离,题目的目的是将S与所有的A连通,使得总距离最小, 所有任选一点开始按最小生成树的算法做就行,并非非要从S点开始 注:题目输入x,y后可能有很多空格,可以用gets将多余的空格取走,开数组是尽量开大点,之前虽然开的比题目数据     稍大,但一