|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 | // @lc code=start
impl Solution {
    /// ## 解题思路
    /// - dfs
    pub fn exist(board: Vec<Vec<char>>, word: String) -> bool {
        // 深度优先搜索
        fn dfs(
            board: &Vec<Vec<char>>,           // 棋盘
            word: &Vec<char>,                 // 字符数组
            visited: &mut Vec<Vec<bool>>,     // 回溯标记
            (i, r, c): (usize, usize, usize), // 遍历标记
        ) -> bool {
            // 边界条件, 剪枝
            if r >= visited.len()
                || c >= visited[0].len()
                || visited[r][c]
                || word[i] != board[r][c]
            {
                return false;
            }
            // 终止条件
            if i == word.len() - 1 {
                return true;
            }
            // 标记遍历状态
            visited[r][c] = true;
            // 尝试下一步搜索
            if dfs(board, word, visited, (i + 1, r + 1, c))
                || dfs(board, word, visited, (i + 1, r - 1, c))
                || dfs(board, word, visited, (i + 1, r, c + 1))
                || dfs(board, word, visited, (i + 1, r, c - 1))
            {
                return true;
            }
            // 恢复遍历状态
            visited[r][c] = false;
            return false;
        }
        let word = word.chars().collect::<Vec<_>>();
        let mut visited = vec![vec![false; board[0].len()]; board.len()];
        for r in 0..board.len() {
            for c in 0..board[0].len() {
                if dfs(&board, &word, &mut visited, (0, r, c)) {
                    return true;
                }
            }
        }
        false
    }
}
// @lc code=end
struct Solution;
 |