只需要求走到相同位置时的坐标不一样,加和不能记录坐标的唯一性,多开一维数组记录
#include<bits/stdc++.h>
using namespace std;
int read() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=1550;
int mp[N][N];
int f=0;
int n,m;
struct point{
int xx,yy;
};
queue<point>q;
int vis[N][N][3];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
void bfs(int x,int y)
{
while(!q.empty())
{
q.pop();
}
q.push((point){x,y});
vis[x][y][0]=1;
vis[x][y][1]=x;
vis[x][y][2]=y;
point now;
int a,b,ma,mb;
while(!q.empty())
{
now=q.front();
a=now.xx;
b=now.yy;
q.pop();
for(int i=0;i<4;++i)
{
ma=(a+dx[i])%n;
mb=(b+dy[i])%m;
while(ma<0)
ma+=n;
while(mb<0)
mb+=m;
if(mp[ma][mb]==0)
continue;
if(vis[ma][mb][0]==1)
{
if(vis[ma][mb][1]==a+dx[i]&&vis[ma][mb][2]==b+dy[i])
continue;
else {
f=1;
break;
}
}
else {
vis[ma][mb][0]=1;
vis[ma][mb][1]=a+dx[i];
vis[ma][mb][2]=b+dy[i];
q.push((point){a+dx[i],b+dy[i]});
}
}
}
}
int main ()
{
int x,y;
char c;
string kk;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;++i)
{
cin>>kk;
for(int j=0;j<m;++j)
{
c=kk[j];
if(c=='#')
{
mp[i][j]=0;
}
else if(c=='.')
{
mp[i][j]=1;
}
else if(c=='S') {
x=i,y=j;
mp[i][j]=1;
}
}
}
f=0;
memset(vis,-1,sizeof(vis));
bfs(x,y);
if(f)
{
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}