同色环
本题主要是记录一下小的技巧
#include <iostream>
using namespace std;
const int N = 55;
char g[N][N];
int n, m;
bool st[N][N];
int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
//设置成上右下左的顺序,这样可以通过异或的方式判断以后要搜索的方向是不是回去的方向
bool dfs(int x, int y, int from)
{
st[x][y] = true;
for (int i = 0; i < 4; i++)
{
int a = x + dx[i], b = y + dy[i];
if ((i ^ 2 )== from) //一个小技巧
continue;
if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] != g[x][y])
continue;
if (st[a][b])
return true;
if(dfs(a, b, i))
return true;
}
return false;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> g[i];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (!st[i][j])
{
if (dfs(i, j, -1))
{
cout << "Yes";
return 0; //直接返回0就能直接终止程序了,之前写的一直比较复杂
}
}
}
}
cout << "No";
return 0;
}