10 10
####.#.#.#
..##...#..
#.########
.S######..
########.#
########.#
.....###..
####.#####
####.#...#
####.#.#.#
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y,tx,ty;
} d;
struct mh
{
int x,y;
}cxk[5][1510];//1上2下3左4右
int p(int lfd){
if(lfd==1)
return 1;
else return 2;
}
int pd(int rick){
if(rick==1||rick==3) return 1;
else return -1;
}
int m,n,x,y,xs,ys,xt,yt,xx,yy;
string a;
queue<node> q;
int movex[5]= {0,1,0,-1,0};
int movey[5]= {0,0,1,0,-1};
int mapp[1510][1510];
int book[1510][1510];
int vis[1510][3];//1横2竖
bool ans=false;
#define debug cout<<"debug"<<endl;
void dabfs(int xn,int yn,int tx,int ty)//dfs and bfs
{
if(ans==false)
{
book[xn][yn]=1;
if((xn==1||xn==n)&&mapp[1][yn]==0&&mapp[n][yn]==0)
{
//debug
if((cxk[2+p(xn)][yn].x!=tx)||(cxk[2+p(xn)][yn].y!=ty))
{
if(vis[yn][2]==0)
{
//cout<<xn<<" "<<yn<<"已走到边界并记录"<<2+p(xn)<<endl;
cxk[2+p(xn)][yn].x=tx;
cxk[2+(3-p(xn))][yn].x=tx+pd(5-p(xn));
cxk[2+p(xn)][yn].y=ty;
cxk[2+(3-p(xn))][yn].y=ty;
//cout<<2+p(xn)<<" "<<yn<<" "<<tx<<" "<<ty<<endl;
//cout<<5-p(xn)<<" "<<yn<<" "<<tx+pd(5-p(xn))<<" "<<ty<<endl;
vis[yn][2]=1;
q.push({xn,yn,tx,ty});
}
else
{
ans=true;
//cout<<"get";
}
}
else{
//cout<<cxk[2+p(xn)][yn].x<<" "<<tx<<"ddd"<<cxk[2+p(xn)][yn].y<<" "<<ty<<" "<<xn<<" "<<yn<<endl;
}
}
if((yn==1||yn==m)&&mapp[xn][1]==0&&mapp[xn][m]==0)
{
//debug
if((cxk[0+p(yn)][xn].x!=tx)||(cxk[0+p(yn)][xn].y!=ty))
{
if(vis[xn][1]==0)
{
//cout<<xn<<" "<<yn<<"已走到边界并记录"<<0+p(yn)<<endl;
cxk[0+p(yn)][xn].x=tx;
cxk[0+(3-p(yn))][xn].x=tx;
cxk[0+p(yn)][xn].y=ty;
cxk[0+(3-p(yn))][xn].y=ty+pd(5-p(yn));
//cout<<0+p(yn)<<" "<<xn<<" "<<tx<<" "<<ty<<endl;
//cout<<3-p(yn)<<" "<<xn<<" "<<tx<<" "<<ty+pd(5-p(yn))<<endl;
vis[xn][1]=1;
q.push({xn,yn,tx,ty});
}
else
{
ans=true;
//cout<<"get";
}
}
else{
//cout<<cxk[0+p(yn)][xn].x<<" "<<tx<<"ddd"<<cxk[0+p(yn)][xn].y<<" "<<ty<<" "<<xn<<" "<<yn<<endl;
}
}
for(int i=1; i<=4; i++)
{
xt=xn+movex[i];
yt=yn+movey[i];
if(mapp[xt][yt]==0&&book[xt][yt]==0)
{
//cout<<xt<<" "<<yt<<"被经过了"<<endl;
dabfs(xt,yt,tx,ty);
}
}
}
}
int main()
{
while(cin>>m>>n)
{
while(!q.empty()) q.pop();
memset(mapp,1,sizeof(mapp));
memset(book,0,sizeof(book));
memset(vis,0,sizeof(vis));
memset(cxk,INT_MAX,sizeof(cxk));
ans=false;
for(int y=1; y<=m; y++)
{
cin>>a;
for(int x=0; x<n; x++)
{
if(a[x]=='.') mapp[x+1][y]=0;
else if(a[x]=='#') mapp[x+1][y]=1;
else
{
mapp[x+1][y]=0;
xs=x+1;
ys=y;
}
}
}
dabfs(xs,ys,0,0);
while(!q.empty()&&ans==false)
{
d=q.front();
q.pop();
//cout<<d.x<<" "<<d.y<<"进行了传送"<<endl;
if(d.x==1)
{
//cout<<"于"<<n<<" "<<d.y<<"在map"<<d.tx-1<<" "<<d.ty<<"再次搜索";
dabfs(n,d.y,d.tx-1,d.ty);
}
if(d.x==n)
{
//cout<<"于"<<1<<" "<<d.y<<"在map"<<d.tx+1<<" "<<d.ty<<"再次搜索";
dabfs(1,d.y,d.tx+1,d.ty);
}
if(d.y==1)
{
//cout<<"于"<<d.x<<" "<<m<<"在map"<<d.tx<<" "<<d.ty-1<<"再次搜索";
dabfs(d.x,m,d.tx,d.ty-1);
}
if(d.y==m)
{
//cout<<"于"<<d.x<<" "<<1<<"在map"<<d.tx<<" "<<d.ty+1<<"再次搜索";
dabfs(d.x,1,d.tx,d.ty+1);
}
}
if(ans==true)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
上面那个数据死活过不去 找了半个月没找到bug在哪 求救qwq