1struct Solution;
2
3impl Solution {
4 fn contains_cycle(grid: Vec<Vec<char>>) -> bool {
5 let n = grid.len();
6 let m = grid[0].len();
7 let mut visited = vec![vec![false; m]; n];
8 for i in 0..n {
9 for j in 0..m {
10 let c = grid[i][j];
11 if Self::dfs(
12 i,
13 j,
14 0,
15 std::usize::MAX,
16 std::usize::MAX,
17 &mut visited,
18 &grid,
19 c,
20 n,
21 m,
22 ) {
23 return true;
24 }
25 }
26 }
27 false
28 }
29
30 fn dfs(
31 i: usize,
32 j: usize,
33 dist: usize,
34 pi: usize,
35 pj: usize,
36 visited: &mut Vec<Vec<bool>>,
37 grid: &[Vec<char>],
38 c: char,
39 n: usize,
40 m: usize,
41 ) -> bool {
42 if dist >= 4 && visited[i][j] {
43 return true;
44 }
45 if visited[i][j] {
46 return false;
47 }
48 visited[i][j] = true;
49 if i > 0 && grid[i - 1][j] == c && i - 1 != pi {
50 if Self::dfs(i - 1, j, dist + 1, i, j, visited, grid, c, n, m) {
51 return true;
52 }
53 }
54 if j > 0 && grid[i][j - 1] == c && j - 1 != pj {
55 if Self::dfs(i, j - 1, dist + 1, i, j, visited, grid, c, n, m) {
56 return true;
57 }
58 }
59 if i + 1 < n && grid[i + 1][j] == c && i + 1 != pi {
60 if Self::dfs(i + 1, j, dist + 1, i, j, visited, grid, c, n, m) {
61 return true;
62 }
63 }
64 if j + 1 < m && grid[i][j + 1] == c && j + 1 != pj {
65 if Self::dfs(i, j + 1, dist + 1, i, j, visited, grid, c, n, m) {
66 return true;
67 }
68 }
69 false
70 }
71}
72
73#[test]
74fn test() {
75 let grid = vec_vec_char![
76 ['a', 'a', 'a', 'a'],
77 ['a', 'b', 'b', 'a'],
78 ['a', 'b', 'b', 'a'],
79 ['a', 'a', 'a', 'a']
80 ];
81 let res = true;
82 assert_eq!(Solution::contains_cycle(grid), res);
83 let grid = vec_vec_char![
84 ['c', 'c', 'c', 'a'],
85 ['c', 'd', 'c', 'c'],
86 ['c', 'c', 'e', 'c'],
87 ['f', 'c', 'c', 'c']
88 ];
89 let res = true;
90 assert_eq!(Solution::contains_cycle(grid), res);
91 let grid = vec_vec_char![['a', 'b', 'b'], ['b', 'z', 'b'], ['b', 'b', 'a']];
92 let res = false;
93 assert_eq!(Solution::contains_cycle(grid), res);
94 let grid = vec_vec_char![
95 ['c', 'a', 'd'],
96 ['a', 'a', 'a'],
97 ['a', 'a', 'd'],
98 ['a', 'c', 'd'],
99 ['a', 'b', 'c']
100 ];
101 let res = true;
102 assert_eq!(Solution::contains_cycle(grid), res);
103 let grid = vec_vec_char![
104 ['b', 'a', 'c'],
105 ['c', 'a', 'c'],
106 ['d', 'd', 'c'],
107 ['b', 'c', 'c']
108 ];
109 let res = false;
110 assert_eq!(Solution::contains_cycle(grid), res);
111}