1. 程式人生 > >NOIP模擬 性感手槍(DFS)

NOIP模擬 性感手槍(DFS)

內網傳送門

結果和這道題一毛一樣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;
}