【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;                           // 回溯:撤销标记,尝试其他分支
            }
        }
    }
};
相关推荐
我不是懒洋洋21 小时前
【数据结构】排序算法(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)
c语言·数据结构·c++·经验分享·算法·排序算法
邪修king21 小时前
UE5:C++ 实现 游戏逻辑 ↔ UI 双向联动
c++·游戏·ue5
穿条秋裤到处跑1 天前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
汉克老师1 天前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
智者知已应修善业1 天前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
云泽8081 天前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
水蓝烟雨1 天前
1931. 用三种不同颜色为网格涂色
算法·leetcode
AI进化营-智能译站1 天前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit1 天前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen871 天前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·