CF510B Fox And Two Dots 题解
作者:互联网
题意
判断一个$n \times m $ 的棋盘上是否有环 \((\)颜色相同的环状连通块,且最少有4块\()\)。
分析
用dfs搜一遍,如果是颜色相同的就继续搜,记录起点和转弯次数,如果转\(4\)次走回起点就输出YES
,如果搜了一遍搜不到环,就输出NO
。
代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN=57;
int n,m,sx,sy;//sx,sy记录本次搜索起点的坐标
char a[MAXN][MAXN];
bool flag;
void dfs(int x,int y,int z,int turns) // x,y分别是当前点的行、列 z是当前的方向(1是下,2是上,3是右,4是左) turns记录转弯次数
{
if(x<=0||y<=0||x>n||y>m) return;
if(turns>4||flag) return;
if(x==sx&&y==sy&&turns==3)
{
flag=true;
return;
}
if(z==0) //出发点
{
if(a[x+1][y]==a[x][y]) dfs(x+1,y,1,0);
if(a[x-1][y]==a[x][y]) dfs(x-1,y,2,0);
if(a[x][y+1]==a[x][y]) dfs(x,y+1,3,0);
if(a[x][y-1]==a[x][y]) dfs(x,y-1,4,0);
}
if(z==1) //从下面来的
{
if(a[x+1][y]==a[x][y]) dfs(x+1,y,1,turns);
if(a[x][y+1]==a[x][y]) dfs(x,y+1,3,turns+1);
if(a[x][y-1]==a[x][y]) dfs(x,y-1,4,turns+1);
}
if(z==2) //从上面来的
{
if(a[x-1][y]==a[x][y]) dfs(x-1,y,2,turns);
if(a[x][y+1]==a[x][y]) dfs(x,y+1,3,turns+1);
if(a[x][y-1]==a[x][y]) dfs(x,y-1,4,turns+1);
}
if(z==3) //从右边来的
{
if(a[x][y+1]==a[x][y]) dfs(x,y+1,3,turns);
if(a[x-1][y]==a[x][y]) dfs(x-1,y,2,turns+1);
if(a[x+1][y]==a[x][y]) dfs(x+1,y,1,turns+1);
}
if(z==4) //从左边来的
{
if(a[x][y-1]==a[x][y]) dfs(x,y-1,3,turns);
if(a[x-1][y]==a[x][y]) dfs(x-1,y,2,turns+1);
if(a[x+1][y]==a[x][y]) dfs(x+1,y,1,turns+1);
}
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>m;
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
sx=i;sy=j;
dfs(i,j,0,0);
if(flag)
{
cout<<"Yes"<<endl;
return 0;
}
}
}
cout<<"No"<<endl;
return 0;
}
标签:Dots,sy,return,int,题解,Fox,dfs,flag,turns 来源: https://www.cnblogs.com/lxy-2022/p/CF510B-Solution.html