回溯算法part06 算法

这篇具有很好参考价值的文章主要介绍了回溯算法part06 算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回溯算法part06 算法

今日任务:
● 51. N皇后
● 37. 解数独

1.leetcode 51. N皇后

https://leetcode.cn/problems/n-queens/description/

class Solution {
    //存储结果
    List<List<String>> result=new ArrayList<>();
    public List<List<String>> solveNQueens(int n) {
        //存放一个棋盘,一个棋盘是一个二维数组
        char[][] chessboard=new char[n][n];
        //将棋盘填满逗点
        for(char[] c:chessboard){
            Arrays.fill(c,'.');
        }
        backrtacing(chessboard,n,0);//棋盘,多深,当前行(深度)
        return result;
        //n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,
        //并且使皇后彼此之间不能相互攻击。
        //皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子
    }
    public void backrtacing(char[][] chessboard,int n,int row){
        //确定终止条件,如果此时深度已经为n了
        if(row==n){
            //将棋盘(二维数组)加进结果(二维集合)中
            //将棋盘二维数组转成一维集合
            //调用函数
            result.add(Array2List(chessboard));
            return;
        }
        //进行判断棋盘二维数组的每一个一维(控制横向)
        for(int i=0;i<n;i++){
            //第一行第一个元素表示是c[row][i]//row控制整体深度,第几行//i控制横向,哪一个元素
            //要放皇后前,先检查这个位置的元素合不合法
            if(isValid(row,i,n,chessboard)){
                //合法了我们就放
                chessboard[row][i]='Q';
                //接着看接下来一层的一维,因为前一个一维已经处理好放不放n皇后了
                backrtacing(chessboard,n,row+1);
                //进行回溯
                chessboard[row][i]='.';//前面函数调用完已经处理加不加进去了
                //然后进行下一次
            }
        }
    }
    //将二维数组转成一维集合
    public List Array2List(char[][] chessboard){
        List<String> list=new ArrayList<>();
        for(char[] c:chessboard){
            list.add(String.copyValueOf(c));
        }
        return list;
    }
    //判断是不是有效的棋盘位置
     public boolean isValid(int row, int col, int n, char[][] chessboard) {
        // 检查列
        for (int i=0; i<row; ++i) { // 相当于剪枝
            if (chessboard[i][col] == 'Q') {
                return false;
            }
        }

        // 检查45度对角线
        for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }

        // 检查135度对角线
        for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }
        return true;
    }
}

2.leetcode 37. 解数独

https://leetcode.cn/problems/sudoku-solver/description/文章来源地址https://www.toymoban.com/news/detail-802783.html

class Solution {
    public void solveSudoku(char[][] board) {
        //没有返回值
        backtracing(board);
    }
    public boolean backtracing(char[][] board){
        //遍历数独的一维横行(遍历行)
        for(int i=0;i<board.length;i++){
            //遍历列
            for(int j=0;j<board.length;j++){
                //如果遇到是数字的元素位置就跳过
                if(board[i][j]!='.'){
                    continue;
                }
                //遇到不是数字元素的位置,也就是遇到逗点了,需要填充数字
                for(char k='1';k<='9';k++){
                    //判断该位置是不是合法的,合法才可以加入数字
                    if(isValidSudoku(i,j,k,board)){
                        board[i][j]=k;
                        //开始递归
                        if(backtracing(board)){//如果有合适的直接返回
                            return true;
                        }
                        //进行回溯
                        board[i][j]='.';
                    }
                }
                //9个数字都试完了还不行,直接返回false
                return false;
            }
        }
        //遍历完没有返回false,说明找到了合适棋盘位置了
        return true;
    }
    //判断棋盘是否合法
    private boolean isValidSudoku(int row, int col, char val, char[][] board){
        // 同行是否重复
        for (int i = 0; i < 9; i++){
            if (board[row][i] == val){
                return false;
            }
        }
        // 同列是否重复
        for (int j = 0; j < 9; j++){
            if (board[j][col] == val){
                return false;
            }
        }
        // 9宫格里是否重复
        int startRow = (row / 3) * 3;
        int startCol = (col / 3) * 3;
        for (int i = startRow; i < startRow + 3; i++){
            for (int j = startCol; j < startCol + 3; j++){
                if (board[i][j] == val){
                    return false;
                }
            }
        }
        return true;
    }
}

到了这里,关于回溯算法part06 算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode题目详解】第八章 贪心算法 part06 738.单调递增的数字 968.监控二叉树 (day37补)

    当且仅当每个相邻位数上的数字  x  和  y  满足  x = y  时,我们称这个整数是 单调递增 的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 109 # 暴力解法 题意很简单,那么首先想的就是暴力解法了,来我替大家

    2024年02月10日
    浏览(32)
  • day44代码训练|动态规划part06

    完全背包和01背包问题唯一不同的地方就是,每种物品有无限件 。 1. dp数组的含义 dp[i][j] 0-i物品,重量为j的容量时,最大的价值 2. 递推公式 dp[i][j] = max(dp[i-1][j],dp[i][j-weight[i]]+value[i]); 两种状态,不用物品i的话,直接是用dp[i-1][j] 选用物品的话,为了重复使用物品i,其实是

    2024年02月03日
    浏览(29)
  • Leetcoder Day39| 动态规划part06 完全背包问题

    有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品都有无限个(也就是可以放入背包多次) ,求解将哪些物品装入背包里物品价值总和最大。 示例: 背包最大重量为4。 物品为: 重量 价值 物品0 1 15 物品1 3 20 物品2 4 30 每

    2024年03月25日
    浏览(30)
  • 动态规划part06 518. 零钱兑换 II 377. 组合总和 Ⅳ

     518 零钱兑换|| 377. 组合总和 Ⅳ  

    2024年01月20日
    浏览(37)
  • 电商项目part06 微服务网关整合OAuth2.0授权中心

    网关整合 OAuth2.0 有两种思路,一种是授权服务器生成令牌, 所有请求统一在网关层验证,判断权 限等操作;另一种是由各资源服务处理,网关只做请求转发。 比较常用的是第一种,把API网关作 为OAuth2.0的资源服务器角色,实现接入客户端权限拦截、令牌解析并转发当前登录

    2024年02月11日
    浏览(24)
  • 06~12-Esp8266物联网芯片的使用(一)-part02/03-ESP8266开发环境、编程举例

    上一章主要作了芯片介绍,这一章主要作对开发环境的介绍。 认识Arduino Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。

    2024年02月05日
    浏览(32)
  • 【LeetCode题目详解】第九章 动态规划part06 完全背的讲解 518. 零钱兑换 II 377. 组合总和 Ⅳ (day44补)

    # 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品都有无限个(也就是可以放入背包多次) ,求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件 。

    2024年02月09日
    浏览(26)
  • 【算法】回溯算法

    本文参考《代码随想录》 原文笔记链接: https://www.programmercarl.com/ B站视频链接: https://www.bilibili.com/video/BV1cy4y167mM?spm_id_from=333.337.search-card.all.clickvd_source=c2d3149b8b6fdae1d68e10dfaabfb1de 回溯法简单来说就是按照深度优先的顺序,穷举所有可能性的算法,但是回溯算法比暴力穷举法

    2024年02月16日
    浏览(22)
  • 初级算法-回溯算法

    主要记录算法和数据结构学习笔记,新的一年更上一层楼! 回溯算法 是递归的副产品,是一种搜索的方式。本质是穷举,可加剪枝操作 可抽象为树形结构,集合大小构成树的宽度,递归的深度,都构成树的深度 1. 组合 :N个数里面按一定规则找出k个数的集合 2. 分割 :一个

    2023年04月27日
    浏览(22)
  • 【算法专题】回溯算法

    什么是回溯算法? 回溯算法是⼀种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。回溯算法在搜索过程中

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包