DFS:从入门到进阶的刷题指南

目录

一、基础DFS:递归实现、状态标记、回溯

全排列问题

组合问题

子集问题

二、网格DFS:二维矩阵遍历、连通块计数、方向数组

岛屿数量

单词搜索

被围绕的区域

[三、 记忆化DFS:动态规划+DFS,缓存中间结果](#三、 记忆化DFS:动态规划+DFS,缓存中间结果)

斐波那契数列(记忆化版)

滑雪

不同路径(带障碍)

[四、 剪枝优化:可行性剪枝、最优性剪枝、预处理优化](#四、 剪枝优化:可行性剪枝、最优性剪枝、预处理优化)

[N 皇后](#N 皇后)

数独求解

火柴拼正方形

五、树/图的DFS:前序/中序/后序遍历、路径搜索、回溯

二叉树路径和

二叉搜索树的范围和

图中所有路径

六、状态压缩DFS:用二进制表示状态,减少存储开销

[翻转游戏 II](#翻转游戏 II)

解数独

最短哈密尔顿路径

七、综合难题:DFS+贪心、DFS+二分、DFS+并查集

栅栏问题

黄金图形

切断圆环链


一、基础DFS:递归实现、状态标记、回溯

全排列问题

cpp 复制代码
#include <iostream>
using namespace std;
int n;
int a[15];
bool vis[15];
void dfs(int x)
{
    if (x > n)
    {
        for (int i = 1; i <= n; i++)
        {
            printf("%5d", a[i]);
        }
        cout << endl;
        return;
    }
    for (int i = 1; i <= n; i++)
    {
        if (!vis[i])
        {
            vis[i] = true;
            a[x] = i;
            dfs(x + 1);
            vis[i] = false;
            a[x] = 0;
        }
    }
}
int main()
{
    cin >> n;
    dfs(1);
    return 0;
}

组合问题

cpp 复制代码
#include <iostream>
using namespace std;
int n, r;
int a[30];
void dfs(int x, int start)
{
    if (x > r)
    {
        for (int i = 1; i <= r; i++)
        {
            printf("%3d", a[i]);
        }
        cout << endl;
        return;
    }
    for (int i = start; i <= n; i++)
    {

        a[x] = i;
        dfs(x + 1, i + 1);
        a[x] = 0;
    }
}
int main()
{
    cin >> n >> r;
    dfs(1, 1);
    return 0;
}

子集问题

cpp 复制代码
#include <iostream>
using namespace std;
int n;
int a[20];
void dfs(int x)
{
    if (x > n)
    {
        for (int i = 1; i <= n; i++)
        {
            if (a[i] == 1)
            {
                cout << i << " ";
            }
        }
        cout << endl;
        return;
    }
    for (int i = 1; i <= 2; i++)
    {
        a[x] = i;
        dfs(x + 1);
        a[x] = 0;
    }
}
int main()
{
    cin >> n;
    dfs(1);
    return 0;
}

二、网格DFS:二维矩阵遍历、连通块计数、方向数组

岛屿数量

单词搜索

被围绕的区域

**三、 记忆化DFS:**动态规划+DFS,缓存中间结果

斐波那契数列(记忆化版)

滑雪

不同路径(带障碍)

**四、 剪枝优化:**可行性剪枝、最优性剪枝、预处理优化

N 皇后

数独求解

火柴拼正方形

**五、树/图的DFS:**前序/中序/后序遍历、路径搜索、回溯

二叉树路径和

二叉搜索树的范围和

图中所有路径

**六、状态压缩DFS:**用二进制表示状态,减少存储开销

翻转游戏

数独

最短哈密尔顿路径

**七、综合难题:**DFS+贪心、DFS+二分、DFS+并查集

栅栏问题

黄金图形

切断圆环链

相关推荐
LGL6030A18 分钟前
算法题实战积累(3)——方块转换(C语言)
c语言·算法
一条星星鱼19 分钟前
深度学习是如何收敛的?梯度下降算法原理详解
人工智能·深度学习·算法
长路归期无望3 小时前
C语言小白实现多功能计算器的艰难历程
c语言·开发语言·数据结构·笔记·学习·算法
MobotStone4 小时前
AI训练的悖论:为什么越追求准确率越会产生幻觉?
算法
怀旧,5 小时前
【C++】26. 智能指针
开发语言·c++·算法
Haooog5 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树
Swift社区6 小时前
LeetCode 392 判断子序列
算法·leetcode·职场和发展
芒果量化6 小时前
ML4T - 第7章第8节 利用LR预测股票价格走势Predicting stock price moves with Logistic Regression
算法·机器学习·线性回归
东方芷兰6 小时前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
Diligence8157 小时前
最优化方法
算法