题目传送门
1 /*
2 DFS:每个点四处寻找,判断是否与前面的颜色相同,当走到已走过的表示成一个环
3 */
4 #include <cstdio>
5 #include <iostream>
6 #include <cstring>
7 #include <string>
8 #include <map>
9 #include <algorithm>
10 #include <vector>
11 #include <set>
12 #include <cmath>
13 using namespace std;
14
15 const int MAXN = 1e6 + 10;
16 const int INF = 0x3f3f3f3f;
17 int dx[4] = {1, -1, 0, 0};
18 int dy[4] = {0, 0, 1, -1};
19 char a[55][55];
20 int used[55][55];
21 int n, m;
22
23 bool DFS(int x, int y, int px, int py, char ch)
24 {
25 used[x][y] = 1;
26 for (int i=0; i<=4-1; ++i)
27 {
28 int tx = x + dx[i];
29 int ty = y + dy[i];
30 if (tx == px && ty == py) continue;
31 if (tx >= 0 && tx <= n-1 && ty >= 0 && ty <=m-1 && a[tx][ty] == ch)
32 {
33 if (used[tx][ty]) return true;
34 if (DFS (tx, ty, x, y, ch)) return true;
35 }
36 }
37
38 return false;
39 }
40
41 int main(void)
42 {
43 //freopen ("B.in", "r", stdin);
44
45 while (cin >> n >> m)
46 {
47 memset (used, 0, sizeof (used));
48 for (int i=0; i<=n-1; ++i)
49 {
50 scanf ("%s", &a[i]);
51 }
52
53 bool flag = false;
54 for (int i=0; i<=n-1; ++i)
55 {
56 for (int j=0; j<=m-1; ++j)
57 {
58 if (!used[i][j])
59 {
60 if (DFS (i, j, -1, -1, a[i][j]))
61 {
62 puts ("Yes"); flag = true; break;
63 }
64 }
65 }
66 if (flag) break;
67 }
68
69 if (!flag) puts ("No");
70 }
71
72 return 0;
73 }