洛谷1363——幻想迷宮(搜尋)
阿新 • • 發佈:2018-12-17
最近真的是越來越菜了
真的什麼都做不起了
連搜尋都不會了
可以把整個平面想象成很多張原始的圖拼起來
因為可以在不同的圖裡面走
走到不同的圖就相當於一個取模操作
而如果在不同的圖中走到了同一個位置
那麼也就是說可以這樣無線走下去
所以我們給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';
}
}