2018.10.26【洛谷P1363】幻想迷宫(搜索)

本文介绍了一种在一倍空间内使用深度优先搜索(DFS)寻找迷宫中是否存在无限路径的方法。通过记录每个位置在不同无限平面上的到达次数,若同一位置由两个不同平面到达,则证明存在无限路径。代码实现采用C++,并展示了如何遍历迷宫地图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门


解析:

扩四倍广搜似乎也可以啊,但是一倍空间的深搜跑的飞快啊,不知道为什么。。。

直接记录上一次深搜到这个坐标的无限平面上的位置,如果有两次不同的无限平面的位置能够到达这里,必然存在无穷远的道路。


代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
#define map MAP

inline int getint(){
    re int num;
    re char c;
    while(!isdigit(c=gc()));num=c^48;
    while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
    return num;
}

inline char getsth(){
    re char c;
    while(isspace(c=gc()));
    return c;
}

cs int N=1503;
cs int dx[4]={0,1,-1,0};
cs int dy[4]={1,0,0,-1};
bool map[N][N],flag;
int vis[N][N][3],idx;
int n,m,sx,sy;

inline bool dfs(cs int &x,cs int &y,cs int &rx,cs int &ry){
    if(vis[x][y][0]==idx)return vis[x][y][1]!=rx||vis[x][y][2]!=ry;
    
    vis[x][y][0]=idx;
    vis[x][y][1]=rx;
    vis[x][y][2]=ry;
    
    for(int re i=0;i<4;++i){
        int tox=(x+dx[i]+n)%n,toy=(y+dy[i]+m)%m;
        if(map[tox][toy])if(dfs(tox,toy,rx+dx[i],ry+dy[i]))return true;
    }
    return false;
}

signed main(){
    while(~scanf("%d%d",&n,&m)){
        ++idx;
        for(int re i=0;i<n;++i)
        for(int re j=0;j<m;++j){
            char c=getsth();
            switch(c){
                case 'S':{
                    map[i][j]=true;
                    sx=i,sy=j;
                    break;
                }
                case '.':{
                    map[i][j]=true;
                    break;
                }
                case '#':{
                    map[i][j]=false;
                    break;
                }
            }
        }
        if(dfs(sx,sy,sx,sy))puts("Yes");
        else puts("No");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值