problem
solution
codes
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 3100;
int n, m, a[maxn][maxn], vis[maxn][maxn], x, y, flag;
const int dx[] = {0,0,-1,1};
const int dy[] = {1,-1,0,0};
void dfs(int x, int y){
if(flag||x<0||x>=2*n||y<0||y>=2*m||a[x][y]||vis[x][y])return ;
if(x>=n||y>=m)
if(vis[x%n][y%m]||vis[x%n+n][y%m]||vis[x%n][y%m+m]||vis[x%n+n][y%m+m]){flag=1;return ;}
vis[x][y] = 1;
for(int i = 0; i < 4; i++)
dfs((x+dx[i]+2*n)%(2*n),(y+dy[i]+2*m)%(2*m));
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n>>m){
flag = 0;
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
char ch; cin>>ch;
if(ch == '#')a[i][j]=1;
if(ch == 'S')x=i,y=j;
}
}
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
a[i][j+m] = a[i][j],
a[i+n][j] = a[i][j],
a[i+n][j+m] = a[i][j];
dfs(x,y);
if(flag)cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}