题目描述
有一个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;
}