Loading... [链接](https://www.luogu.org/problemnew/show/P1363 "链接") <!--more--> * * * 看完题目,最开始的思路是先对图进行搜索,然后搜索在边界的位置是否有道路可以通向这张图对面相同的位置,但是这样的情况就判断不了。 S.#.. ##### #...# 很明显这张图中上面的道路和下面的道路并不直接相连,但是却可以无限延伸。 所以我看了题解。。。 掌嘴。。。 我好菜啊。。。 心里好慌。。。 然后就是搜索,每一个点向四个方向搜,如果搜到边界,用取模的方式到这张地图的另外一边,同时保存其真实的坐标,这样一来,当真实坐标和这个位置上次访问到的坐标不同时,说明这个点访问了两次,就是说可以无限延伸。 具体看代码吧 ```cpp #include<bits/stdc++.h> using namespace std; int n,m; int a[1509][1509]; struct node{ int x,y; bool v; }d[1509][1509]; bool flag=0; int yc[4]={0,0,-1,1},xc[4]={1,-1,0,0}; void dfs(int x,int y,int rx,int ry){ if(flag) return; if(d[x][y].v&&(d[x][y].x!=rx||d[x][y].y!=ry)){ flag=1; return; } d[x][y].x=rx,d[x][y].y=ry,d[x][y].v=1;//这里更新一下相当于上次访问到的真实坐标。 for(int i=0;i<4;i++){ int nx,ny; if(x+xc[i]==0) nx=n; else if(x+xc[i]==n+1) nx=1; else nx=x+xc[i]; if(y+yc[i]==0) ny=m; else if(y+yc[i]==m+1) ny=1; else ny=y+yc[i]; int nrx=rx+xc[i],nry=ry+yc[i]; if(!a[nx][ny]&&(d[nx][ny].x!=nrx||d[nx][ny].y!=nry||!d[nx][ny].v)){ dfs(nx,ny,nrx,nry); } } } int main(){ node start; while(cin>>n>>m){ flag=0; for(int i=1;i<=n;i++){ string c; cin>>c; for(int j=1;j<=m;j++){ d[i][j].x=0,d[i][j].y=0,d[i][j].v=0; a[i][j]=0; if(c[j-1]=='#') a[i][j]=1; if(c[j-1]=='S') start.x=i,start.y=j; } } dfs(start.x,start.y,start.x,start.y); if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; } ``` Last modification:March 14, 2020 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏