DFS。
开一个标记数组,每一个点查找是否有环,已经走过的点不需要再走。
每一次搜索,标记当前点是第几步走到的,若这两个点步数相差3,则成环。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
char a[55][55];
int book[55][55]; //三种状态,0:未走过 >0:当前这一次搜索中是第几步到达该点的 -1:已经搜过,不成环
int s;
int d[4][2] = {1,0,0,1,-1,0,0,-1};
int n,m;
void dfs(int x,int y,int step);
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
getchar();
memset(book,0,sizeof(book));
for(int i=0;i<n;i++){
scanf("%s",a[i]);
}
s = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(book[i][j]==0){
book[i][j] = 1;
dfs(i,j,1+1);
if(s==1) break;
book[i][j] = -1; //已经搜过,不用再搜
}
}
if(s==1) break;
}
if(s==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
void dfs(int x,int y,int step){
for(int i=0;i<4;i++){ //对四个方向搜索
int p = x+d[i][0];
int q = y+d[i][1];
if(p>=0&&p<n&&q>=0&&q<m&&book[p][q]>=0&&a[p][q]==a[x][y]){
if(book[p][q]>0){
if(step-book[p][q]>=3){ //若步数相差3,则成环
s = 1;
return ;
}
}
else if(book[p][q]==0){
book[p][q] = step;
dfs(p,q,step+1);
if(s==1) return ;
}
}
}
book[x][y] = -1; //搜过,不需再搜
}