分析
直接裸的DFS。
两个条件:判断能否走下一步,以及有没有走超过4步。
记得回溯。
喜闻乐见的裸题
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int dx[5]={0,1,0,-1};
int dy[5]={-1,0,1,0};
bool ans,v[2500][2500],a[2500][2500];
char b[2500][2500];
bool check(int q,int p,char x)
{
if(q<1||p<1||q>n||p>m||x!=b[q][p]||v[q][p]) return 0;
return 1;
}
void dfs(char s,int x,int y,int step)
{
if(ans!=0)
{
return;
}
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(a[xx][yy]&&step>=4)
{
ans=1;
return;
}
if(!check(xx,yy,s)) continue;
v[xx][yy]=1;
dfs(s,xx,yy,step+1);
v[xx][yy]=0;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>b[i][j];
v[i][j]=1;
a[i][j]=1;
dfs(b[i][j],i,j,1);
v[i][j]=0;//回溯
a[i][j]=0;
}
}
if(ans) cout<<"Yes";
else cout<<"No";
return 0;
}