当前位置: 代码迷 >> 综合 >> 2025 : 简单环路(DFS)
  详细解决方案

2025 : 简单环路(DFS)

热度:5   发布时间:2023-12-26 13:19:57.0

题目描述

有一个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;
}