传送门
解析:
扩四倍广搜似乎也可以啊,但是一倍空间的深搜跑的飞快啊,不知道为什么。。。
直接记录上一次深搜到这个坐标的无限平面上的位置,如果有两次不同的无限平面的位置能够到达这里,必然存在无穷远的道路。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
#define map MAP
inline int getint(){
re int num;
re char c;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
return num;
}
inline char getsth(){
re char c;
while(isspace(c=gc()));
return c;
}
cs int N=1503;
cs int dx[4]={0,1,-1,0};
cs int dy[4]={1,0,0,-1};
bool map[N][N],flag;
int vis[N][N][3],idx;
int n,m,sx,sy;
inline bool dfs(cs int &x,cs int &y,cs int &rx,cs int &ry){
if(vis[x][y][0]==idx)return vis[x][y][1]!=rx||vis[x][y][2]!=ry;
vis[x][y][0]=idx;
vis[x][y][1]=rx;
vis[x][y][2]=ry;
for(int re i=0;i<4;++i){
int tox=(x+dx[i]+n)%n,toy=(y+dy[i]+m)%m;
if(map[tox][toy])if(dfs(tox,toy,rx+dx[i],ry+dy[i]))return true;
}
return false;
}
signed main(){
while(~scanf("%d%d",&n,&m)){
++idx;
for(int re i=0;i<n;++i)
for(int re j=0;j<m;++j){
char c=getsth();
switch(c){
case 'S':{
map[i][j]=true;
sx=i,sy=j;
break;
}
case '.':{
map[i][j]=true;
break;
}
case '#':{
map[i][j]=false;
break;
}
}
}
if(dfs(sx,sy,sx,sy))puts("Yes");
else puts("No");
}
return 0;
}