算法系列--递归,回溯,剪枝的综合应用(3)(下)

简介: 算法系列--递归,回溯,剪枝的综合应用(3)(下)

算法系列--递归,回溯,剪枝的综合应用(3)(上)

https://developer.aliyun.com/article/1480885?spm=a2c6h.13148508.setting.14.5f4e4f0euaAisj

💕"对相爱的人来说,对方的心意,才是最好的房子。"💕

作者:Lvzi

文章主要内容:算法系列–递归,回溯,剪枝的综合应用(3)

大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(3),带来几个比较经典的问题N皇后解数独,这两道都是hard级别的题目,但是不要被吓到!请看我的分析

2.有效的数独

:本题只是一个引子,是为了给解数独这道题目做引入

链接:

https://leetcode.cn/problems/valid-sudoku/description/

分析:

本题需要判断已经填入数字的数独是否有效,判断条件和N皇后那道题目的剪枝策略很像,具体的判断条件如下:

  1. 当前数字所在位置的相同不能有相同的数字
  2. 当前数字所在位置的相同不能有相同的数字
  3. 当前数字所在位置所处的九宫格不能有相同的数字

行和列只需要使用两个二维的布尔类型的数组进行标记即可,但是九宫格这个判断条件如何标记呢?这里用到了一个比较巧妙的策略,将连续的三个位置看成一个数字,

代码:

class Solution {
    boolean[][] row, col;
    boolean[][][] grid;
    public boolean isValidSudoku(char[][] board) {
        row = new boolean[9][10];
        col = new boolean[9][10];
        grid = new boolean[3][3][10];
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                if(board[i][j] != '.') {
                    int num = board[i][j] - '0';
                    if(col[j][num] == true || row[i][num] == true || grid[i / 3][j / 3][num] == true)
                        return false;
                    col[j][num] = row[i][num] = grid[i / 3][j / 3][num] = true;
                }
            }
        }
        return true;
    }
}

3.解数独

链接:

https://leetcode.cn/problems/sudoku-solver/description/

分析:

很容易分析出本题是一个递归问题,因为每一步做的事情都是相同的

  • 存入数字,判断是否符合条件

递归的策略也容易想出–以一个一个的空格进行枚举

1.设计代码

全局变量

  • row[][],col[][]分别用于标记行和列
  • grid[][][]:用于标记九宫格

dfs:

  • 函数头:只需要传递原始的棋盘即可,返回值设置为boolean
  • 函数体:关注每一个子问题具体干的事情,在当前空位置从数字1枚举到数字9,判断是否符合添加的条件,如果可以,就填入,并递归下一个空位置
  • 递归出口:全部填充完毕

2.剪枝

注意有可能上一步的策略会导致当前位置无法填入任何数字,也就是上一步的策略是否有效需要递归到后面的子问题才能知道,一旦某个子问题中发现无法填入任何数字,证明上一步的策略是失败的,没有必要继续递归下去,此时就发生了剪枝,对于每一次递归来说,都需要返回一个布尔类型的数据,用于记录策略成功与否

3.回溯

回溯的策略和N皇后很像,恢复原状即可

代码:

class Solution {
    boolean[][] row, col;
    boolean[][][] grid;
    public void solveSudoku(char[][] board) {
        row = new boolean[9][10];
        col = new boolean[9][10];
        grid = new boolean[3][3][10];
        // 初始化
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                if(board[i][j] != '.') {
                    int num = board[i][j] - '0';
                    row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true;
                }
            }
        }
        // 递归
        dfs(board);
    }
    private boolean dfs(char[][] board) {
        // 这里采用的递归的策略是一个一个空位置进行递归的
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                if(board[i][j] == '.') {
                    for(int num = 1; num <= 9; num++) {
                        if(!row[i][num] && !col[j][num] && !grid[i / 3][j / 3][num]) {// 剪枝
                            board[i][j] = (char)('0' + num);
                            row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true;
                            // 递归下一个位置
                            if(dfs(board) == true) return true;// 当前位置的策略是成功的
                            board[i][j] = '.';// 回溯
                            row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = false;
                        }
                    }
                    return false;// 走到这里证明当前位置一个数字也填不了,需要更换上一步的策略
                }
            }
        }
        return true;// 所有的空位都被填充
    }
}

一定要重点理解代码中三个return的实际含义

(本题真的很有意思,你可以利用上述代码快速的完成一道大师级的数独题目哦~笔者已经试过一次,真的很爽!!!)


目录
相关文章
|
12天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
52 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
12天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
46 0
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
52 1
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
机器学习/深度学习 监控 算法
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用
|
12天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
6天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。

热门文章

最新文章