【2020.10.26 SSL模拟赛T3】棋盘行走【dfs】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析:

数据不大 直接 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
*/

猜你喜欢

转载自blog.csdn.net/dgssl_xhy/article/details/109299291