NOIP模擬 性感手槍(DFS)
阿新 • • 發佈:2018-10-31
內網傳送門
結果和這道題一毛一樣233
【題目分析】
當我拿到題目的一瞬間,就有一種熟悉感,莫非。。。。。
考完下來一問,woc,竟然是氵谷原題!我還記得不久前刷氵題(一個下午20道那種),然後翻到這道題。。。。不可做啊無限地圖是什麼鬼,丟了丟了,結果。。。。。。。。。
好了不扯了,我們開三維陣列vis[i][j][k]表示之前訪問到(i,j)這個位置x(k=0),y(k=1)分別是什麼,如果不同就說明可以通過另外一條路到達,就可以進行迴圈。
#include<bits/stdc++.h> using namespace std; const int MAXN=1510; int n,m,sx,sy,flag; char x; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int vis[MAXN][MAXN][3]; int ma[MAXN][MAXN]; void dfs(int x,int y,int x1,int y1) { if(vis[x][y][2]) { if(vis[x][y][0]!=x1||vis[x][y][1]!=y1) flag=1; return ; } vis[x][y][0]=x1; vis[x][y][1]=y1; vis[x][y][2]=1; for(int i=0;i<4;i++) { int x2=x+dx[i],y2=y+dy[i]; if(x2<1) x2=n; if(x2>n) x2=1; if(y2<1) y2=m; if(y2>m) y2=1; if(ma[x2][y2]) dfs(x2,y2,x1+dx[i],y1+dy[i]); if(flag) return ; } } int main() { int T; scanf("%d",&T); while(T--) { cin>>n>>m; memset(ma,0,sizeof(ma)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { char s[MAXN]; scanf("%s",s+1); for(int j=1;j<=m;j++) { if(s[j]=='S') { sx=i,sy=j; ma[i][j]=1; } if(s[j]=='.') ma[i][j]=1; } } flag=0; dfs(sx,sy,sx,sy); if(flag) puts("Yes"); else puts("No"); } return 0; }