分析:
数据不大 直接 d f s dfs dfs即可过
十分简易 且 喜闻乐见
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define re register
using namespace std;
const int N=2505;
int n,m,dx[5]={
0,1,0,-1},dy[5]={
-1,0,1,0};
bool ans,vis[N][N],start[N][N];
char a[N][N];
bool check(int q,int p,char x)
{
if(q<1||p<1||q>n||p>m||x!=a[q][p]||vis[q][p])
return 0;
else{
return 1;
}
}
void dfs(char qwq,int x,int y,int step) //dfs
{
if(ans) return;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(start[xx][yy]&&step>=4) //符合条件
{
ans=1;
return;
}
if(!check(xx,yy,qwq)) continue;
vis[xx][yy]=1;
dfs(qwq,xx,yy,step+1); //继续搜
vis[xx][yy]=0;
}
}
int main(){
scanf("%d%d",&n,&m);
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
{
cin>>a[i][j];
vis[i][j]=1;
start[i][j]=1; //每个点可作为起点
dfs(a[i][j],i,j,1);
vis[i][j]=0;
start[i][j]=0;
}
printf((ans)?"Yes":"No");
return 0;
}
/*
3 4
AAAA
ABCA
AAAA
*/