内网传送门
结果和这道题一毛一样233
【题目分析】
当我拿到题目的一瞬间,就有一种熟悉感,莫非。。。。。
考完下来一问,woc,竟然是氵谷原题!我还记得不久前刷氵题(一个下午20道那种),然后翻到这道题。。。。不可做啊无限地图是什么鬼,丢了丢了,结果。。。。。。。。。
好了不扯了,我们开三维数组vis[i][j][k]表示之前访问到(i,j)这个位置x(k=0),y(k=1)分别是什么,如果不同就说明可以通过另外一条路到达,就可以进行循环。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1510;
int n,m,sx,sy,flag;
char x;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int vis[MAXN][MAXN][3];
int ma[MAXN][MAXN];
void dfs(int x,int y,int x1,int y1)
{
if(vis[x][y][2])
{
if(vis[x][y][0]!=x1||vis[x][y][1]!=y1)
flag=1;
return ;
}
vis[x][y][0]=x1;
vis[x][y][1]=y1;
vis[x][y][2]=1;
for(int i=0;i<4;i++)
{
int x2=x+dx[i],y2=y+dy[i];
if(x2<1)
x2=n;
if(x2>n)
x2=1;
if(y2<1)
y2=m;
if(y2>m)
y2=1;
if(ma[x2][y2])
dfs(x2,y2,x1+dx[i],y1+dy[i]);
if(flag)
return ;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
cin>>n>>m;
memset(ma,0,sizeof(ma));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
char s[MAXN];
scanf("%s",s+1);
for(int j=1;j<=m;j++)
{
if(s[j]=='S')
{
sx=i,sy=j;
ma[i][j]=1;
}
if(s[j]=='.')
ma[i][j]=1;
}
}
flag=0;
dfs(sx,sy,sx,sy);
if(flag)
puts("Yes");
else
puts("No");
}
return 0;
}