【Hot 100 刷题计划】 LeetCode 79. 单词搜索 | C++ 标准方向数组 DFS 与回溯

LeetCode 79. 单词搜索

📌 题目描述

题目级别:中等

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

  • 示例 1:
    输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
    输出:true

💡 破题思路:网格 DFS 深度优先搜索

这道题是经典的"迷宫寻宝"模型,我们采用 DFS(深度优先搜索)+ 回溯 的算法框架。

核心逻辑拆解:

  1. 寻找起点 :我们需要两层 for 循环遍历整个二维网格,只要遇到和目标单词首字母相同的字符,就把它作为起点启动 DFS。
  2. 方向控制 :使用经典的算法竞赛套路------方向数组 dx[4]dy[4]。通过一个简单的 for (int i = 0; i < 4; i++) 循环,就能优雅地向上下左右四个方向进行位置的偏移试探。
  3. 状态标记与回溯
    • 题目要求"同一个单元格内的字母不允许被重复使用",因此我们需要一个状态数组 st 来记录哪些格子当前正在路径中。
    • 向下探索前,标记 st[x][y] = 1
    • 如果后续这条路走不通(碰壁),退回来时,必须把状态重置为 st[x][y] = 0,以便其他路径重新经过这里。这就叫回溯

💻 C++ 代码实现 (保留原汁原味作者版)

cpp 复制代码
class Solution {
public:
    int dx[4] = {0, -1, 0, 1};
    int dy[4] = {-1, 0, 1, 0};
    int res = 0, m, n;
    int st[20][20]; // 状态数组,记录格子是否已被访问

    bool exist(vector<vector<char>>& board, string word) {
        m = board.size(), n = board[0].size();

        for (int i = 0; i < m; i ++ )
            for (int j = 0; j < n; j ++ )
            {
                // 找到与单词首字母匹配的起点
                if (board[i][j] == word[0])
                {
                    // 每次开启全新的寻找前,清空访问状态
                    memset(st, 0, sizeof st);
                    dfs(board, word, 1, i, j);
                }
            }

            return res;
    }

    void dfs(vector<vector<char>>& board, string word, int pos, int x, int y)
    {
        // 递归终止条件:成功拼出了目标单词
        if (pos == word.size())
        {
            res = 1;
            return ;
        }

        // 向四个方向试探
        for (int i = 0; i < 4; i ++ )
        {
            int xx = x + dx[i], yy = y + dy[i];

            // 越界检查 && 访问状态检查 && 字符匹配检查
            if (xx >= 0 && xx < m && yy >= 0 && yy < n && !st[xx][yy] && board[xx][yy] == word[pos])
            {
                st[x][y] = 1;                           // 标记当前起点为已访问
                dfs(board, word, pos + 1, xx, yy);      // 向下一层深入探索
                st[x][y] = 0;                           // 回溯:撤销标记,尝试其他分支
            }
        }
    }
};
相关推荐
知无不研42 分钟前
lambda表达式的使用(3)
开发语言·c++·lambda
半夏微凉半夏殇1 小时前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
C++ 老炮儿的技术栈2 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qz_Serene4 小时前
C++:类和对象(上)
开发语言·c++
郝学胜-神的一滴6 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆6 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
hetao17338376 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
evans在进步6 小时前
LeetCode 33:搜索旋转排序数组——Java 两阶段二分查找详解
java·python·leetcode
alphaTao6 小时前
LeetCode 每日一题 2026/8/10-2026/8/16
算法·leetcode
Forever Nore7 小时前
LeetCode 13 罗马数字转整数 - 按规则处理
linux·服务器·leetcode