深度优先搜索练习之神奇的矩环
题目是让找一个长度不为一的环,用DFS即可。
#include <iostream>
#include <cstring>
using namespace std;
char mp[510][510];
bool vis[210][210];
int n, m;
int fx[] = {0, 0, 1, -1}, fy[] = {1, -1, 0, 0};
bool flag;
void dfs(int x, int y, int c, int d)
{
vis[x][y] = 1;
for(int i = 0; i < 4; i++)
{
int a = x + fx[i], b = y + fy[i];
if(a <= n && b <= m && a >= 1 && b >= 1 && mp[a][b] == mp[x][y])
{
if(vis[a][b] == 0)//如果没有走过则继续向下走
dfs(a, b, x, y);
else if(a != c && b != d)//如果被走过看,如果a == c 且 b == d,则是长度为一的环
{
flag = 1;
return;
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
while(cin >> n >> m)
{
flag = 0;
memset(vis, 0, sizeof vis);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> mp[i][j];
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(vis[i][j] == 0)
{
dfs(i, j, i, j);
if(flag)
break;
}
}
if(flag)
break;
}
if(flag)
cout << "Yes\n";
else
cout << "No\n";
}
return 0;
}