day25|51.N皇后、37.解数独

news2024/11/15 15:32:49

51.N皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例 1:

输入:n = 4

输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]

解释:如上图所示,4 皇后问题存在两个不同的解法。 

示例 2:

输入:n = 1

输出:[["Q"]] 

 问题分析:

1、递归函数参数

定义全局变量二维数组result来记录最终结果。

参数n是棋盘的大小,然后用row来记录当前遍历到棋盘的第几层了。

2、递归终止条件

当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了

3、单层搜索的逻辑

递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。

每次都是要从新的一行的起始位置开始搜,所以col都是从0开始。

  • 验证棋盘是否合法
  1. 不能同行
  2. 不能同列
  3. 不能同斜线 (45度和135度角) 

例如:n=3,没有符合条件的棋盘

注意:要把数组转换为字符串 

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,'.');
        }
        backtracking(n,0,chessboard);
        return result;
    }
    public void backtracking(int n,int row,char[][] chessboard){
        if (row==n){
            result.add(Array2List(chessboard));
            return;
        }
        for (int col=0;col<n;col++){
            if (isValid(row,col,n,chessboard)){
                chessboard[row][col]='Q';
                backtracking(n,row+1,chessboard);//下一层
                chessboard[row][col]='.';//回溯
            }
        }
    }
    public List Array2List(char[][] chessboard){//数组转换字符串
        List<String> path=new ArrayList<>();
        for (char[] c:chessboard){//每一行
            path.add(String.copyValueOf(c));//copyValueOf返回char参数的字符串
        }
        return path;
    }
    
    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;
            }
        }

        for (int i=0;i<col;i++){
            if (chessboard[row][i]=='Q'){
                return false;
            }
        }

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

}

 37.解数独

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例 1:

输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]

输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]

解释:输入的数独如上图所示,唯一有效的解决方案如下所示: 

问题分析:

1、递归函数以及参数

找整个树用void,找单个树枝boolean。因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用boolean返回值。

2、递归终止条件

本题递归不用终止条件,解数独是要遍历整个树形结构寻找可能的叶子节点就立刻返回。其终止条件其实在单层搜索逻辑里。

3、递归单层搜索逻辑

需要两个for循环,二维递归。一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性。

如果找到合适的位置就return true,若9个数都试完了,没有一个合法,那就return false,这也就是为什么没有终止条件,也不会永远填不满棋盘而无限递归下去。

到最后遍历完如果没有false,就返回true。

判断棋盘是否合法有如下三个维度:

  • 同行是否重复
  • 同列是否重复
  • 9宫格里是否重复

class Solution {
    public void solveSudoku(char[][] board) {//无需定义result集合,因为返回类型是void,直接改数组的值
        backtracking(board);
    }
    public boolean backtracking(char[][] board){
        //无需终止条件,最后在单层搜索的逻辑会返回
        for (int i=0;i<9;i++){//遍历行
            for (int j=0;j<9;j++){//遍历列
                if (board[i][j]!='.'){
                    continue;
                }
                if (board[i][j]=='.'){
                    for (char k='1';k<='9';k++){//判断放置数字1-9是否可行
                        if (isValid(i,j,k,board)){//判断是否合法
                            board[i][j]=k;
                            boolean result=backtracking(board);//假设放1之后开始递归,
                                              //数独上在放1之后所有放的数都有妥善的位置,
                                             //就返回ture,此时整个数独的放置都结束了
                            if (result==true){//只要最后找到一种数独结果就返回
                                return true;
                            }
                         /*  if (backtracking(board)){
                               return true;
                           }*/
                           board[i][j]='.';//回溯退回
                        }
                    }
                    //9个数放在这个位置都不行,就返回false
                    return false;//这也是不需要终止条件的原因
                }
            }
        }
        //遍历完没有false
        return true;
    }

    public boolean isValid(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;
            }
        }
        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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sylixos input子系统学习、调试记录

Input 子系统框架图&#xff1a; Xinput设备驱动层&#xff1a; 将所有设备抽象成xmes、xkbd设备&#xff0c;上层程序&#xff08;如Qt&#xff09;就可以像操作普通字符设备一样操作它们。 Xinput核心处理层&#xff1a; 从物理设备取得输入事件&#xff0c;然后通过消息队…

校招失败后,在小公司熬了 2 年终于进了字节跳动,竭尽全力....

其实两年前校招的时候就往字节投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

【软件测试面试】国企6年测试经验大D佬分析总结测试团队面试问题......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 国企测试大佬测试面…

一起自学SLAM算法:11.5 强化学习与自主导航

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;[21]属于机器学习领域的一个分支&#xff0c;其学习目标是获得最大回报。在10.3.1节中已经讨论过&#xff0c;机器学习过程主要涉及四个要…

【Java并发详解】

参考书目&#xff1a; 堆和方法区中的数据是可以被共享的 堆中的数据是被栈中的变量所持用的&#xff0c;栈是线程隔离的&#xff0c;每个线程私有一个栈&#xff0c;所以栈中的数据不共享 调用a方法时&#xff0c;jvm会给a方法创建一块内存区&#xff0c;让其入栈&#xff…

UIRecorder安装、录制、回放

Github地址&#xff1a;https://github.com/alibaba/uirecorder/blob/master/README_zh-cn.md 支持 android ios 和pc端的自动化脚本录制。无线native app(Android, iOS)录制是&#xff0c;是基于macaca实现的&#xff1a;https://macacajs.com 整体组成架构 UIRecorder录制功…

Dubbo服务开发和运行流程【java面试】

(1)问题分析&#xff1a;考官主要想考核dubbo的原理&#xff0c;还有dubbo在项目中的使用。(2)核心答案讲解&#xff1a;dubbo服务开发流程&#xff1a;maven工程中pom文件先导入dubbo依赖jar包搭建zookeeper注册中心写好服务端工程并配置dubbo服务端配置&#xff0c;并关联上z…

Spring概览——最佳入门实践

1、Spring Framework Spring 基础框架&#xff0c;可以视为 Spring 基础设施&#xff0c;基本上任何其他 Spring 项目都是以 Spring Framework 为基础的。 1.1、Spring Framework特性 建议新手先看完的最佳实践&#xff0c;再回头看这一段。 非侵入式&#xff1a;使用 Spri…

Java List按照某字段去重

Java List按照某字段去重嘚吧嘚distinct示例一示例二根据某个字段去重Collectors.collectingAndThen()嘚吧嘚 Java8流的新类java.util.stream.Collectors实现了java.util.stream.Collector接口&#xff0c;同时又提供了大量的方法对流(stream)的元素执行各种统计操作。 distinc…

实战: 跨年烟花代码的实现(附源码)

目录 前言 一、pandas是什么&#xff1f; 二、代码结构 1.介绍主html代码 2. js文件介绍 GameCanvas.js script.js 运行效果 前言 本文章将介绍跨年烟花代码的实现以及源代码 提示&#xff1a;以下是本篇文章正文内容 一、pandas是什么&#xff1f; 示例&#xff1a;pandas …

css3-动画

目录语法转换平移旋转缩放复合属性的顺序问题过渡动画帧动画案例案例1-热点图dot(缩放)案例2-热点图dot(缩放)案例3-开红包(旋转)问题问题1-transform不起作用问题2 - 过渡动画不起效果语法 转换 css3中的转换允许我们对元素进行旋转、缩放、移动或倾斜。它分为2D转换 或 3D转…

开箱即用的物联网平台-IoTLink

物联网平台是物联网生态系统的重要组成部分&#xff0c;也是一个快速增长的市场&#xff0c;物联网平台为企业提供了巨大的价值&#xff0c;使他们能够降低开发成本、加速启动和简化流程。 一个完整的物联网系统需要硬件、连接、软件、用户界面等。在较高的层面上&#xff0c;…

menuconfig的执行过程

menuconfig &#xff08;1&#xff09;首先在uboot源码顶层目录下的Makefile文件中查找config&#xff08;%表示省略&#xff09; &#xff08;2&#xff09;执行make menuconfig&#xff0c;分别打印输出$(MAKE)、$(bulid)、$可知其对应的内容&#xff0c;如上图所示 总结&a…

用docker部署django后台作为webstack的后台管理系统-其二

0 序言 在之前的博客中&#xff1a; 用docker部署webstack导航网站-其一https://blog.csdn.net/qq_41938259/article/details/128736551?spm1001.2014.3001.5501我成功的将webstack官方推荐的docker容器部署了出来&#xff0c;但是官方的docker容器后端使用的是PHP&#xff0…

08_FreeRTOS列表和列表项讲解

目录 列表和列表项的简介 列表 列表项 迷你列表项 列表和列表项的关系 列表相关API函数介绍 初始化列表vListInitialise函数详解 列表项的初始化函数vListInitialiseItem函数 列表项的插入vListInsert函数 列表项末尾插入vListInsertEnd函数 列表项的删除函数uxLis…

零入门容器云网络实战-5->路由知识总结

本篇文章主要用于收集、整理、总结路由相关知识点。 1、路由分为几种&#xff1f; 直连路由静态路由&#xff08;基本静态路由&#xff0c;等价静态路由&#xff0c;活动静态路由&#xff0c;缺省静态路由&#xff09;动态路由 通过路由协议从相邻路由器学习到的。路由协议&am…

一,SpringMVC入门

0 MVC设计模式 View&#xff08;视图&#xff09;&#xff1a;页面&#xff08;jsp、html&#xff09;&#xff0c;接收用户数据和显示结果。 Controller&#xff08;控制器&#xff09;&#xff1a;action&#xff0c;接收请求&#xff0c;决定程序执行流程。 Model&#xf…

【深度学习】——循环神经网络RNN及实例气温预测

引言 密集连接网络和卷积神经网络都有主要的特点&#xff0c;那就是它们没有记忆。它们单独处理每个输入&#xff0c;在输入和输入之间没有保存任何状态。举个例子&#xff1a;当你在阅读一个句子的时候&#xff0c;你需要记住之前的内容&#xff0c;我们才能动态的了解这个句子…

三、SqlSession的创建以及执行流程

简介 SqlSession接口提供了查询&#xff0c;插入&#xff0c;更新&#xff0c;删除方法&#xff0c;Mybatis中所有的数据库交互都由SqlSession来完成。SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法&#xff0c;它的底层封装了 JDBC 连接&#xff0c;可以用…

微服务链路追踪SkyWalking学习笔记

目录 1、skywalking是什么 1.2 链路追踪框架对比 1.3 性能对比 1.4 Skywalking主要功能特性 2、 SkyWalking 环境搭建部署 2.1 下载 SkyWalking 2.2 搭建SkyWalking OAP 服务 2.3 SkyWalking中三个概念 3、 SkyWalking 接入微服务 3.1 linux环境—通过jar包方式接入 …