洛谷1363——幻想迷宫(搜索)

传送门

最近真的是越来越菜了

真的什么都做不起了

连搜索都不会了

可以把整个平面想象成很多张原始的图拼起来

因为可以在不同的图里面走

走到不同的图就相当于一个取模操作

而如果在不同的图中走到了同一个位置

那么也就是说可以这样无线走下去

所以我们给vis数组开三维

分别记录visit、原始(未取模)的x坐标、原始的y坐标

如果搜索到了一个已经vis过的点

而且不是同一个图的话

说明可以无线走下去了

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
    char ch=getchar();
    int res=0;
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
    return res;
}
char x;
int n,m,kx,ky;
int vis[1505][1505][3];
char ch[1505][1505];
bool f;
const int fx[5]={0,-1,0,1,0};
const int fy[5]={0,0,1,0,-1};
char y;
inline int nxtx(int x,int k){
    if(x+fx[k]>n){
        return x+fx[k]-n;
    }
    if(x+fx[k]<=0){
        return x+fx[k]+n;
    }
    return x+fx[k];
}
inline int nxty(int y,int k){
    if(y+fy[k]>m){
        return y+fy[k]-m;
    }
    if(y+fy[k]<=0){
        return y+fy[k]+m;
    }
    return y+fy[k];
}
void dfs(int ax,int ay,int px,int py){
    if(f)return;
    if(vis[ax][ay][0]&&(vis[ax][ay][1]!=px||vis[ax][ay][2]!=py)){
        f=1;return;
    }
    vis[ax][ay][0]=1;vis[ax][ay][1]=px,vis[ax][ay][2]=py;
    for(int i=1;i<=4;i++){
        int gx=nxtx(ax,i),gy=nxty(ay,i);
        int lx=px+fx[i],ly=py+fy[i];
        if(ch[gx][gy]!='#'){
            if(!vis[gx][gy][0]||vis[gx][gy][1]!=lx||vis[gx][gy][2]!=ly)
            dfs(gx,gy,lx,ly);
        }
    }
}
int main(){
    int T=read();
    while(T--)
    {
        f=false;
        n=read(),m=read();
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=n;i++){
            scanf("%s",ch[i]+1) ;         
            for(int j=1;j<=m;j++){
                if(ch[i][j]=='S')kx=i,ky=j;
            }
        }
        dfs(kx,ky,kx,ky);
        if(f)cout<<"Yes"<<'
';
        else cout<<"No"<<'
';
    }
}
原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366445.html