题目大意:在图中找到一个字符可以围成一个环(至少有环四个相同元素)
题目思路:对当前点进行搜索,如果发现可以达到某个已经被查找过的点,且当前点不是由这个点而来,则查找成功。
#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 1005 using namespace std; char Map[MAX][MAX],op;//op记录当前字符 struct node
{
int x,y;
}pre[MAX][MAX];//pre数组记录当前点的前驱节点
int n,m,vis[MAX][MAX],ok,v[][]={{,},{-,},{,},{,-}}; int check(int x,int y,int a,int b)
{
if(a>= && a<n && b>= && b<m && (pre[x][y].x!=a ||pre[x][y].y!=b) && Map[a][b]==op)
return ;
return ;
} void DFS(int x,int y)
{
for(int i=;i<;i++)
{
int a=x+v[i][];
int b=y+v[i][];
if(check(x,y,a,b))
{
if(vis[a][b])
{
ok=;
return;
}
pre[a][b].x=x;
pre[a][b].y=y;
vis[a][b]=;
DFS(a,b);
}
}
if(ok==)
return;
} int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
ok=;
memset(vis,,sizeof(vis));
for(i=;i<MAX;i++)
{
for(j=;j<MAX;j++)//初始化每个点的前驱点都是本身
{
pre[i][j].x=i;
pre[i][j].y=j;
}
}
for(i=;i<n;i++)
scanf("%s",Map[i]);
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
if(!vis[i][j])
{
op=Map[i][j];
vis[i][j]=;
DFS(i,j);
}
if(ok)
break;
}
if(ok)
break;
}
if(ok)
printf("Yes\n");
else
printf("No\n");
}
return ;
}