2025 : 简单环路(DFS)

题目描述

 
  
有一个N x M 大小的地图,地图中的每个单元包含一个大写字母。
若两个相邻的(这里的相邻指“上下左右”相邻)点上的字母相同,我们可以用线段连接这两个点。
若存在一个包含同一字母的环路,那么连接这些点我们可以得到一个多边形,
当且仅当多边形的边数大于等于4时,我们称这幅地图中存在“简单环路”。
现在给你一份地图,你来判断是否存在“简单环路”。
列如:
3 4
AAAA
ABCA
AAAA
字符“A”可以构成一个“简单环路”,其边数为4。

输入

 
  
第一行输入两个正整数n,m,2<=n,m<=50,分别表示地图的行列数。
接下来输入n行,每行m个大写字母。

输出

若存在“简单环路”输出“Yes”,否则输出“No”。

样例输入

复制
3 4
AAAA
ABCA
AADA

样例输出

复制
No

参考代码:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 55;
char a[N][N];
bool vis[N][N];
int road[4][2] = {-1,0, 1,0, 0,-1, 0,1};
int n, m;

int ans = 0;

void dfs_Hs(int sx, int sy, int x, int y, int k) {
	if(k > 2 && x == sx && y == sy) {
		ans ++;
		return ;
	}
	int temx, temy;
	for(int i=0; i<4; i++) {
		temx = x + road[i][0];
		temy = y + road[i][1];
		if(temx<0 || temx>=n || temy<0 || temy>=m) continue;
		if(vis[temx][temy] || a[temx][temy]!=a[x][y]) continue;
		if(k == 2 && temx == sx && temy == sy) continue;
	//	cout << temx << " " << temy << endl; 
		vis[temx][temy] = true;
		dfs_Hs(sx, sy, temx, temy, k+1); 
	}
}
int main() {
	memset(vis, false, sizeof(vis));
	cin >> n >> m;
	
	for(int i=0; i<n; i++) {
		cin >> a[i];
	}
	
	bool flag = false;
	for(int i=0; i<n; i++) {
		for(int j=0; j<m; j++) {
			memset(vis, 0, sizeof(vis));
			if(vis[i][j]) continue;
			ans = 0;
			dfs_Hs(i, j, i, j, 1);
			if(ans > 0) {
				flag = true;
				break;
			}
		}
		if(flag) break;
	}
	
	if(flag) cout << "Yes" << endl;
	else cout << "No" << endl; 
	return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_38737992/article/details/80420919