最近真的是越来越菜了
真的什么都做不起了
连搜索都不会了
可以把整个平面想象成很多张原始的图拼起来
因为可以在不同的图里面走
走到不同的图就相当于一个取模操作
而如果在不同的图中走到了同一个位置
那么也就是说可以这样无线走下去
所以我们给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"<<'
';
}
}