思路:
dfs搜索题,对于每一个坐标记录走到的步数,对于相同字母的坐标(x,y)可一步到达(X,Y),如果(X,Y)坐标已走过,并且d(x,y)-d(X,Y)≥3的话,则存在环路。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Max_n=110;
int n,m;
char s[Max_n][Max_n];
int d[Max_n][Max_n];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool dfs(int x,int y,char ch){
for(int i=0;i<4;i++){
int X=x+dx[i],Y=y+dy[i];
if(d[X][Y]&&s[X][Y]==ch&&d[x][y]-d[X][Y]>=3)return true; //存在环路
if(!d[X][Y]&&s[X][Y]==ch){
d[X][Y]=d[x][y]+1;
if(dfs(X,Y,ch))return true;
}
}
return false;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++){ //遍历每个坐标
for(int j=1;j<=m;j++){
if(!d[i][j]){
d[i][j]=1;
if(dfs(i,j,s[i][j])){printf("Yes\n");return 0;}
}
}
}
printf("No\n");
return 0;
}