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;
}

猜你喜欢

转载自blog.csdn.net/g21glf/article/details/83417050