题意:n*m个字母,判断能否成环。
分析:成环至少需要四个相同字母,dfs一直往下搜索,每遇到相同字母将其标记,若遇到相同字母且被标记可判断已成环(此字母不能是上一个字母,因此要记录下此时的字母)。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=60;
int n,m;
bool vis[maxn][maxn];
char str[maxn][maxn];
bool flag=0;
int dis[4][2]={0,1,0,-1,1,0,-1,0};
void dfs(int x,int y,int lx,int ly,char s)
{
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int nx=x+dis[i][0];
int ny=y+dis[i][1];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&str[nx][ny]==s)
{
if(vis[nx][ny]&&(nx!=lx||ny!=ly))
flag=1;
if(!vis[nx][ny])
{
vis[nx][ny]=1;
dfs(nx,ny,x,y,s);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s",str[i]);
getchar();
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!vis[i][j])
dfs(i,j,-1,-1,str[i][j]);
if(flag)
break;
}
if(flag)
break;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
return 0;
}