1. 程式人生 > >洛谷1363——幻想迷宮(搜尋)

洛谷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"<<'\n'; else cout<<"No"<<'\n'; } }