1-04D. 膨胀的tyx

题目描述

由于tyx抱过了这么多大腿,他变得越来越棒棒了,一般的迷宫根本拦不住他。为了治一治他,你决定为他单独定制一款无限迷宫。

所谓无限迷宫是指,由一个  的迷宫单元经过无限平铺得到的迷宫,即将无数份迷宫单元平铺在一个二维平面上。定制好以后,你将tyx扔到了迷宫里,不妨假定tyx落在了起点处。

出于对无限迷宫的恐惧,tyx想要尽可能逃离这里。那么问题来了,tyx能不能逃到距离起点无限远的地方去呢?

输入格式

第一行两个整数  ,用来描述迷宫单元的尺寸。

接下来是一个  的字符矩阵,用来描述这个迷宫,每个字符一定属于以下三种:

  1. 字符'.'代表这个点是空地。

  2. 字符'S'代表这个点是起点。

  3. 字符'#'代表这个点是墙,不可以走。

输出格式

输出一行一个字符串“Yes”或“No”(不包括引号),“Yes”表示tyx可以逃到无限远的地方,“No”表示不可以。

样例

样例输入1

3 3
#.#
#.#
#S#

样例输出1

Yes

样例输入2

5 5
#.#.#
..#.S
#####
..#..
#.#.#

样例输出2

No

c++AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,b[2005][2005][5];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char a[2005][2005];
bool vis[2005][2005];
struct node{
	int x,y,ex,ey;
}t1,t2;
inline void bfs(int x,int y){
	queue<node> q;
	t1.x=t1.ex=b[x][y][0]=x,t1.y=t1.ey=b[x][y][1]=y;
	q.push(t1);
	while(!q.empty()){
		t1=q.front();
		q.pop();
		for(int i=0;i<=3;i++){
			int dx=t1.x+dir[i][0],dy=t1.y+dir[i][1];
			int tx=t1.ex+dir[i][0],ty=t1.ey+dir[i][1];
			if(dx==n+1)dx=1;
			if(dx==0)dx=n;
			if(dy==m+1)dy=1;
			if(dy==0)dy=m;
			if(a[dx][dy]!='#'){
				t2.ex=tx,t2.ey=ty,t2.x=dx,t2.y=dy;
				if(vis[dx][dy]){
					if(b[dx][dy][0]!=tx||b[dx][dy][1]!=ty){
						printf("Yes");
						exit(0);
					}else continue;
				} 
				vis[dx][dy]=true;
				b[dx][dy][0]=tx,b[dx][dy][1]=ty;
				q.push(t2);
			} 
		}
	}
	printf("No");
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("\n%c",&a[i][j]);
			if(a[i][j]=='S')x=i,y=j;
		}
	}
	vis[x][y]=true;
	bfs(x,y);
	return 0;
}
 
posted @ 2021-03-20 08:09  黄逸飞重庆八中  阅读(65)  评论(0编辑  收藏  举报