首页 > 其他 > 详细

【洛谷P1363】幻象迷宫

时间:2018-07-24 17:19:36      阅读:238      评论:0      收藏:0      [点我收藏+]

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;
}

【洛谷P1363】幻象迷宫

原文:https://www.cnblogs.com/yjkhhh/p/9360440.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!