【洛谷P1363】幻象迷宫
2024-08-26 11:14:11
P1363 幻想迷宫
显然,若从原图中起点走到相邻的图中对应的“起点”位置 ,就可以无限走下去,
若一个点从原图中可以到达,到了非原图中也可以到达,就可以无限走下去
我们不妨记录下当前到达的x,y坐标,同时也记录下在%n,%m下的坐标,
int vis[x][y][3]; x,y表示在%n,%m下的坐标,vis[x][y][1]表示是否到达过x’%n=x,y’%n=y的x’,y’
vis[x][y][1]记录x',vis[x][y][2]记录y',若第二次经过时实际坐标不同,则可以无限走下去
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 1520
#define reset(a) memset(a,0,sizeof(a))
int n,m,que[N*N*2][4],head,tail,vis[N][N][3];
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
bool map[N][N],flag;
int main(){
while(cin>>n){
cin>>m; flag=0;
reset(map); reset(vis);
head=tail=0;
char c=getchar();
for(int i=1;i<=n;i++){
while(c!='.'&&c!='#'&&c!='S')
c=getchar();
for(int j=1;j<=m;j++){
if(c=='S'){
map[i][j]=1;
vis[i][j][0]=1;
vis[i][j][1]=i;
vis[i][j][2]=j;
que[++tail][0]=i;
que[tail][1]=j;
que[tail][2]=i;
que[tail][3]=j;
}
else if(c=='.')
map[i][j]=1;
c=getchar();
}
}
while(head<tail){
int x1=que[++head][0];
int y1=que[head][1];
int x2=que[head][2];
int y2=que[head][3];
for(int i=1;i<=4;i++){
int nx2=x2+dx[i];
int ny2=y2+dy[i];
int nx1=(x1+dx[i]+n-1)%n+1;
int ny1=(y1+dy[i]+m-1)%m+1;
if(!map[nx1][ny1]) continue;
if(vis[nx1][ny1][0]){
if(vis[nx1][ny1][1]==nx2)
if(vis[nx1][ny1][2]==ny2)
continue;
{flag=1; break;}
}
if(flag) break;
vis[nx1][ny1][0]=1;
vis[nx1][ny1][1]=nx2;
vis[nx1][ny1][2]=ny2;
que[++tail][0]=nx1;
que[tail][1]=ny1;
que[tail][2]=nx2;
que[tail][3]=ny2;
}
if(flag) break;
}
if(flag) puts("Yes");
else puts("No");
}
return 0;
}
最新文章
- 企业办公3D指纹考勤系统解决方案(一)
- LaTeX Software &; Manuals
- WS调用的时候报错
- C++混合编程之idlcpp教程Lua篇(3)
- [kuangbin带你飞]专题十二 基础DP1
- 内存泄漏检测工具Valgrind
- python类型转换、数值操作(转)
- PHP读取文件内容的三种方式
- OpenLayers 添加OpenStreetMap(OSM)瓦片层示例
- sed命令基础
- centOS7上编译hadoop-2.7.7
- 本机mysql 5.7服务启动后停止,某些服务在未有其他应用程序使用时停止
- asp.net验证码
- docker下搭建fastfds集群版
- jedis 连接 redis:Could not get a resource from the pool——我的出错原因和解决办法
- Matlab绘图——对称曲线绘制(转)
- ZOJ 3203 Light Bulb (三分查找)
- Fiddler2 java代码拦截设置
- OpenCV的配置
- hadoop之安全篇