代码随想录day30 回溯算法最终章

51. N皇后

题目

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

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

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

示例 1:

  • 输入:n = 4
  • 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
  • 解释:如上图所示,4 皇后问题存在两个不同的解法。

思考

看到题就懵了,感觉和之前做的回溯算法完全不一样,这是真的开放性的题,开了卡哥的视频大概梳理出来了一些思路:

1、要创建的结果数组是三维的,因为棋盘是二维的,要存放棋盘

2、因为棋盘是n*n的,那么当纵向递归遍历到n时,收获结果

3、单层递归其实没啥难度,主要是判断当满足题意三个条件时才能纵向递归,注意这里要因为是在二维数组里递归,那么横向遍历的i和纵向递归遍历其实没啥关系,不用startIndex,直接row+1即可

4、满足的三个条件怎么写:

  • 不能同一列出现两个Q,即col不变,判断从0到row的所有数是否有Q
  • 不能45度出现Q,即3,3到2,2到1,1或者3,2到2,1不能出出现Q,row-1,col-1即可
  • 不能135度出现Q,出3,3到2,4到1,5不能出现Q,row-1,col+1即可

代码

class Solution {

public:

    vector<vector<string>> res;

    void backTracking(vector<string>& chess, int n, int row){

        if(row == n) {

            res.push_back(chess);

            return;

        }

        for(int col = 0; col < n; col++) {

            if(isValid(row, col, chess, n)){

                chess[row][col] = 'Q';

                backTracking(chess, n, row+1);

                chess[row][col] = '.';

            }

        }

    }

    bool isValid(int row, int col, vector<string> chess, int n ) {

        for(int i = 0; i < row; i++) {

            if(chess[i][col] == 'Q') return false;

        }

        for(int i = row-1, j = col-1; i>=0 && j>=0; i--&j--) {

            if(chess[i][j]== 'Q') return false;

        }

        for(int i = row -1, j = col+1; i>=0 && j<n; i-- && j++) {

            if(chess[i][j] == 'Q') return false;

        }

        return true;

    }

    vector<vector<string>> solveNQueens(int n) {

        vector<string> chess(n, string(n, '.'));

        backTracking(chess, n, 0);

        return res;

    }

};

37. 解数独

题目

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

一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。

解数独

一个数独。

解数独

答案被标成红色。

提示:

  • 给定的数独序列只包含数字 1-9 和字符 '.' 。
  • 你可以假设给定的数独只有唯一解。
  • 给定数独永远是 9x9 形式的。

思考

太难了,感觉和n皇后是差不多的,也是三个条件,但是具体应该怎么写完全一头雾水,看完卡哥视频稍微总结一下吧:

  1. 上来不是void函数,是bool类型的,直接遍历,i<9,j<9
  2. 当board[i][j] =='.'时,说明需要填充数字,开始循环判断1-9中哪个数字满足条件,如果满足,直接填上
  3. 注意,这里的中止条件竟然在填充完数字后,如果填充了,那么判断整个函数是否为true,如果为true,返回true
  4. 如果1-9中数字不满足条件,那么要return false
  5. 三个条件写法
  • 纵向判断要填充的数字是否已经在那一列里
  • 横向判断要填充的数字是否已经在那一行里
  • 在3*3的九宫格里判断要填充的数字是否在九宫格里,用两个for循环,并且startRow和StartCol需要用(row/3)*3来表示

代码

class Solution {

private:

    bool backTracking(vector<vector<char>>& board) {

        for(int i = 0; i < board.size(); i++) {

            for(int j = 0; j < board.size(); j++) {

                if(board[i][j] == '.') {

                    for(char k = '1'; k <= '9'; k++) {

                        if(isValid(i, j, k, board)) {

                            board[i][j] = k;

                            bool tmp = backTracking(board);

                            if(tmp) return true;

                            board[i][j] = '.';

                        }

                    }

                    return false;

                }

            }

        }

        return true;

    }

    bool isValid(int row, int col, char val, vector<vector<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;

    }

public:

    void solveSudoku(vector<vector<char>>& board) {

        backTracking(board);

    }

};

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

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

相关文章

想做好项目,网工必看!

上午好&#xff0c;我是老杨。 做项目&#xff0c;贯穿一个网络工程师职业生涯的始终。不管是大项目还是小项目&#xff0c;做久了项目&#xff0c;都会形成一种自己的方法论。 项目要划分&#xff0c;无非就是新网组建&#xff0c;旧网优化&#xff0c;以及网络排障三大类。…

【已解决】Spring常见错误:类文件具有错误的版本 61.0, 应为 52.0

目录 问题复现原因分析错误依赖正确依赖 问题复现 报错内容如下&#xff1a; java: 无法访问org.springframework.web.bind.annotation.RequestMapping 错误的类文件: /D:/Java/Apache Software Foundation/apache-maven-3.6.3/maven/repository/org/springframework/spring…

ISO11898-闭环高速CAN网络 (125K~1Mbps)

ISO11898 标准的物理框图如下图 可理解为一个高速闭环 CAN 总线网络&#xff1b;CAN 闭环总线网络允许总线最大长度为 40m;最高速度为 1Mbps;可以看到总线的两端各有一个 120Ω 的电阻&#xff0c;此电阻作为阻抗匹配功能&#xff0c;以减少回波反射;节点就是不同的设备&#…

Pytorch基础知识点复习

文章目录 并行计算单卡训练多卡训练单机多卡DP多机多卡DDPDP 与 DDP 的优缺点 PyTorch的主要组成模块Pytorch的主要组成模块包括那些呢&#xff1f;Dataset和DataLoader的作用是什么&#xff0c;我们如何构建自己的Dataset和DataLoader&#xff1f;神经网络的一般构造方法&…

k8s的策略

集群调度&#xff1a; Scheduler的调度算法&#xff1a; 预算策略 过滤出合适的节点 优先策略 选择部署的节点 NodeName&#xff1a;硬策略&#xff0c;不走调度策略&#xff0c;node1 nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走一个调度算法 只要是…

Git基础操作

Git 是一种分布式版本控制系统&#xff0c;用于管理软件项目的源代码。它是由 Linux 之父 Linus Torvalds 开发的&#xff0c;并已经成为了现代软件开发领域中最流行的版本控制系统之一。 使用 Git 可以追踪代码的历史修改记录&#xff0c;方便团队协作、代码共享和代码重构。…

系统性学习vue-vue核心

做了三年前端,但很多系统性的知识没有学习 还是从头系统学习一遍吧 课程是b站的Vue2.0Vue3.0课程 后续还会学习的如下,就重新开一篇了,不然太长,之后放链接 vue组件化编程 vue-cli 脚手架 vue中的ajax vue-router vuex element-ui vue3 老师推荐的vscode针对vue的插件: Vue 3…

机器学习~从入门到精通(二)线性回归算法和多元线性回归

为什么要做数据归一化 一、数据归一化&#xff1a; 1.最值归一化 2.均值方差归一化import numpy as npX np.random.randint(1,100,size100) X X.reshape(-1,2) X.shape X np.array(X,dtypefloat) X[:,0] (X[:,0]-np.min(X[:,0]))/(np.max(X[:,0])-np.min(X[:,0])) X[:,1]…

洛谷最经典题目之--垂直柱状图

一起来交流编程吧【CSDN app】&#xff1a; http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kx9pL9ccIHGKNLE0CWviAqQ_q6HzxomLW&authKeyVslKe623ptw8VRepda%2Bh0Ttr8Ruz8v%2FBW5HpVzyTWU7ECwpHIZpULMj6qIHYZBVb&noverify0&gro 垂直柱状图 题目描述 写一个程序从…

Postgres 中文周报:Postgres Weekly 537 期

本周报由 Cloudberry Database 社区编译自英文版《Postgres Weekly》&#xff0c;译文较原文有所调整。 推荐博文 &#x1f3c6; PostgreSQL: The DBMS of the Year 2023 PostgreSQL 荣获 DB-Engines 网站 2023 年度 DBMS 冠军。DB-Engines 收集了 480 款数据库系统信息并跟踪…

机器学习笔记 - 基于OpenCV+稀疏光流的无监督运动检测

一、简述 在各种高级开源库的帮助下&#xff0c;检测固定摄像机拍摄的运动行为是轻而易举可以实现的&#xff0c;但检测移动的摄像机拍摄的移动物体的运动检测依然是一个复杂的问题。在这里&#xff0c;我们将继续基于稀疏光流&#xff0c;并检测移动的无人机相机的运动。 这里…

项目篇 | 图书管理系统 | 账号模块 | 登录

项目篇 | 图书管理系统 | 账号模块 | 登录 概述 该系统实现了管理员登录和用户登录,二者的实现和逻辑几乎完全一致,这里以用户登录为例进行讲解。 函数简介 // account.h void userLoginPage(); // 用户登录页 void userLogin(); // 用户登录userLoginPage:功能页,用户登…

设计模式-传输对象模式

设计模式专栏 模式介绍模式特点应用场景传输对象模式和序列化的区别代码示例Java实现传输对象模式Python实现传输对象模式 传输对象模式在spring中的应用 模式介绍 传输对象模式&#xff08;Transfer Object Pattern&#xff09;是一种设计模式&#xff0c;用于从客户端向服务…

Pandas实战100例 | 案例 11: 添加新列 - 使用 `assign` 方法

案例 11: 添加新列 - 使用 assign 方法 知识点讲解 在 Pandas 中&#xff0c;assign 方法是添加新列到 DataFrame 的一种高效方式。这个方法可以使你在不改变原始 DataFrame 的基础上&#xff0c;添加一列或多列。assign 方法特别适用于链式调用&#xff0c;使得数据处理步骤…

X射线探测器检测锻件缺陷,如何将缺陷显现在图像中的呢?

问题描述&#xff1a;X射线探测器检测锻件缺陷&#xff0c;如何将缺陷显现在图像中的呢&#xff1f; 问题解答&#xff1a; X射线探测器检测锻件缺陷的原理主要是利用X射线的穿透性和成像技术。当X射线穿透锻件时&#xff0c;由于不同材料对X射线的吸收程度不同&#xff0c;因…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺&#xff0c;4*A53架构&#xff0c;Android 9.0操作系统&#xff0c;搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力&#xff0c;专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…

MySQL进阶篇(五) 锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…

深入浅出Android dmabuf_dump工具

目录 dmabuf是什么&#xff1f; dmabuf_dump工具介绍(基于Android 14) Android.bp dmabuf_dump.cpp 整体架构结构如下 dmabuf_dump主要包含以下功能 前置背景知识 fdinfo 思考 bufinfo Dump整个手机系统的dmabuf Dump某个进程的dmabuf​​​​​​​ 以Table[buff…

【JVM 基础】类字节码详解

JVM 基础 - 类字节码详解 多语言编译为字节码在JVM运行Java字节码文件Class文件的结构属性从一个例子开始反编译字节码文件字节码文件信息常量池方法表集合类名 再看两个示例分析try-catch-finallykotlin 函数扩展的实现 源代码通过编译器编译为字节码&#xff0c;再通过类加载…

C、C++、QT 中的字符串格式和处理方法

1. C的C风格字符串采用的是什么编码格式&#xff1f; C 的 C 风格字符串并没有指定特定的编码格式。它只是一个以 null 字符&#xff08;’\0’&#xff09;作为结尾的字符数组&#xff0c;可以存储 ASCII 字符或多字节字符序列。编码格式是由使用字符串的上下文和编译器的设置…