B. Fox And Two Dots
题目链接
题意:给定一个n×m的字符矩阵, 判断是否存在一个有四个点以上的相同字符组成的循环,如图:
题解:从第一个点开始依次枚举,一直向上下左右四个方向深搜每一个字符相同的点,如果深搜回到初始位置且已经搜到4个点以上,则说明存在;
dfs(i,j,ans):i,j代表枚举到i,j这个点,ans代表搜到了几个点
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100010;
int m,n;
int q,w;
char a[60][60];
bool g[60][60];//记录当前搜索状态
bool ok;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//代表四个方向的坐标改变
void dfs(int i,int j,int ans){
if(ok) return ;
if(i==q&&j==w&&ans>=4) {
ok=true;
return ;
}
for(int k=0;k<4;k++) {//枚举四个方向
int x=i+dx[k],y=j+dy[k];
if(x<0||x>=n||y<0||y>=m||g[x][y]) continue;
if(!g[x][y]&&a[x][y]==a[q][w]) {
g[x][y]=true;
dfs(x,y,ans+1);//深搜
g[x][y]=false;//回溯
}
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++) scanf("%s",a[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){//枚举每一个点
q=i;w=j;
dfs(i,j,1);
if(ok) break;//如果存在就不必继续枚举
}
if(ok) cout<<"Yes\n";
else cout<<"No\n";
return 0;
}