Infinite Maze CodeForces - 196B(简单搜索)

本文探讨了一种在可重复拼接的迷宫中寻找无限行走路径的算法。通过使用广度优先搜索(BFS)并记录每个节点的前驱,判断是否可以从起点出发,在迷宫的无限复制中找到循环路径。核心思路在于检查新图上的位置是否曾被旧图覆盖过。
摘要由CSDN通过智能技术生成

传送门:QAQ

题意:给你一张图,让你从图的起点开始走,走过的地方会崩塌,但是会有相同的图可以拼接起来,问你是否可以在这些途中无限走。

 

思路:如果在一张新图上走到之前旧图走过的点,那就可以无限走了。

 

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long LL;

char ch[1510][1510];
int dx[5] = { 1,0,-1,0 };
int dy[5] = { 0,1,0,-1 };
int xx, yy;
int n, m;
int fla;
struct inst {
	int x;
	int y;
	inst() {}
	inst(int x, int y) :x(x), y(y) {}
};
inst vis[1510][1510];
void bfs() {
	queue<inst>q;
	q.push(inst(xx, yy));
	vis[xx][yy].x = xx;
	vis[xx][yy].y = yy;
	while (!q.empty()) {
		inst nd = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			int x1 = nd.x+dx[i];
			int y1 = nd.y+dy[i];
			int x2 = x1%n;
			int y2 = y1%m;
			if (x2 < 0) x2 += n;
			if (y2 < 0) y2 += m;
			if (vis[x2][y2].x == -inf && vis[x2][y2].y == -inf && ch[x2][y2] != '#') {
				vis[x2][y2].x = x1;
				vis[x2][y2].y = y1;
				q.push(inst(x1, y1));
				//printf("%d  %d\n", x1, y1);
			}
			else if ((vis[x2][y2].x != x1||vis[x2][y2].y != y1)&&ch[x2][y2] != '#' && (x1<0 || x1 >= n || y1<0 || y1 >= m)) {
				fla = 1;
				return;
			}
		}
	}
	return;
}
int main(void) {
	scanf("%d%d", &n, &m);
	for (int i = 0; i <= n; i++) {
		for (int z = 0; z <= m; z++) {
			vis[i][z].x = vis[i][z].y = -inf;
		}
	}
	fla = 0;
	for (int i = 0; i < n; i++) {
		scanf("%s", ch[i]);
		for (int z = 0; z < m; z++) {
			if (ch[i][z] == 'S') {
				xx = i;
				yy = z;
			}
		}
	}
	bfs();
	if (fla) {
		printf("Yes\n");
	}
	else printf("No\n");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值