【LeetCode】N皇后-回溯

news2024/9/28 17:24:46

N皇后-回溯

  • N皇后
    • 题目
    • 示例
    • 分析
    • 代码
  • N皇后II
    • 题目
    • 示例
    • 分析
    • 代码
  • 总结

N皇后

题目

LeetCode 51.N皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例

示例1

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

Alt
示例2

输入:n = 1
输出:[["Q"]]

分析

给定n,题目要求的就是0-n-1这n个数的满足要求的所有排列方式,需要满足的条件就是,对于任意两个棋子,不能存在同行、同列、同对角线的情况。

从第0行开始,需要在[0, n-1]中选择一个数,在对应位置放置棋子,然后是第1行、第2行…直至第n-1行

显然,题目的本质就是一个排列问题,只是在这些排列方式中,需要去除某些不符合要求的情况,排列问题可以用回溯算法求解,确定求解方法为回溯。

定义一个回溯函数,backtrack(vector &board, int row), 其中board为二维数组,记录当前棋局,row为当前处理行。

在backtrack函数内部,需要注意一些细节:

  • 终止条件是row == n,即所有行都已经处理完,这时当前的棋盘就是一个合法的解,加入结果集中
  • 为了去除某些不合要求的排列,每次对位置做选择时,先要判断一下,用一个isValid函数来判断当前位置是否存在同行、同列、同对角线的情况,如果存在,continue

回溯算法框架

res = []
backtrack(棋局,选择列表):
	if 满足终止条件:
		res.push_back(棋局)
		return 
	for 选择 in 选择列表:
		做选择
		backrack(棋局,选择列表)
		撤销选择

代码

class Solution {
public:
    vector<vector<string>> res;
    vector<vector<string>> solveNQueens(int n) {
        vector<string> board(n, string(n, '.'));
        backtrack(board, 0);
        return res;
    }

    void backtrack(vector<string> &board, int row) {
        int n = board.size();
        if (row == n) {
            res.push_back(board);
            return;
        }

        for (int i = 0; i < n; i++) {
            if (!isValid(board, row, i)) continue;
            board[row][i] = 'Q';
            backtrack(board, row + 1);
            board[row][i] = '.';
        }
    }

    bool isValid(vector<string> &board, int row, int col) {
        int n = board.size();
        for (int i = row; i >= 0; i--) { //上方
            if (board[i][col] == 'Q') return false;
        }
        for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) { //左上方
            if (board[i][j] == 'Q') return false;
        }
        for (int i = row, j = col; i >= 0 && j < n; i--, j++) { //右上方
            if (board[i][j] == 'Q') return false;
        }
        return true;
    }

};

N皇后II

题目

LeetCode 52.N皇后II

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

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

示例

示例1

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

在这里插入图片描述

示例 2:

输入:n = 1
输出:1

分析

与上道N皇后完全一样,不过只需要记录排列方式的总数,而不用存储具体的排列方式

代码

class Solution {
public:
    int res = 0;
    int totalNQueens(int n) {
        vector<vector<int>> board(n, vector<int>(n, 0));
        backtrack(board, 0);
        return res;
    }

    void backtrack(vector<vector<int>> &board, int row) {
        int n = board.size();
        if (row == n) {
            res++;
            return;
        }
        for (int i = 0; i < n; i++) {
            if (!isValid(board, row, i)) continue;
            board[row][i] = 1;
            backtrack(board, row + 1);
            board[row][i] = 0;
        }
    }
    
    bool isValid(vector<vector<int>>& board, int r, int c) {
        int n = board.size();
        for (int i = 0; i < r; i++) {
            if (board[i][c]) return false;
        }
        for (int i = r, j = c; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j]) return false;
        }
        for (int i = r, j = c; i >= 0 && j < n; i--, j++) {
           if (board[i][j]) return false;
        }
        return true;
    }
};

总结

扩展:如果仅要求不能同行同列,不要求不能对角线,那这题完全就是n个数的全排列问题

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

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

相关文章

第二篇 - Vue 的初始化流程

一&#xff0c;前言 上篇&#xff0c;使用 rollup 完成了 Vue2 源码环境的搭建 本篇&#xff0c;介绍 Vue 的初始化流程 二&#xff0c;Vue 简介 以两个概念性问题做简单介绍 1&#xff0c;问题&#xff1a;Vue 是 MVVM 框架吗&#xff1f; 在 Vue 官网上是这样说的&#…

LeetCode450之删除二叉搜索树中的节点(相关话题:二叉搜索树,删除)

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#x…

VS封装C++项目以及属性配置

目录 1. 封装单个项目 1.1 封装 新建C空项目&#xff0c;将需要封装的源文件(eval.cpp)和 头文件(eval.h)复制过来&#xff0c;并对它们做如下修改&#xff1a; 注&#xff1a;如果有多个头文件和源文件&#xff0c;只对可供外部调用的文件及其内部的函数作下面的处理 分别…

1.c++环境配置及第一个环境运行

开发IDE与环境 最好是使用ubuntu系统进行开发&#xff0c;如果没有的话&#xff0c;基于windows使用vs code 进行ssh连接到远程的ubuntu主机进行开发也可以。开发的过程跟本地差不多。 vs code IDE 插件的安装 1.变成中文菜单与提示,安装MS-CEINTL.vscode-language-pack-zh-…

《MySQL系列-InnoDB引擎13》文件-参数文件

文件 MySQL数据和InnoDB存储引擎表中的各种类型的文件&#xff0c;这些文件如下&#xff1a; 参数文件&#xff1a;MySQL启动时的数据库文件&#xff0c;指定初始化参数&#xff0c;介绍各种参数类型&#xff0c;以及定义某种内存结构的大小等日志文件&#xff1a;用来记录My…

C语言日常练习

这里写目录标题循环结构输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数求Snaaaaaaaaaa……的值&#xff0c;其中a是一个数字&#xff0c;n表示a的个数&#xff0c;n和a都由键盘输入一维数组从键盘输入十个数&#xff0c;并将正着输出反着输出从键盘输入十个数&…

虹科案例 | 解决ASRS系统的痛点问题居然这么简单?(上)

摘要 ASRS(自动存储和检索系统)在内部物流领域变得越来越常见。内部物流包括优化、整合、自动化和管理履行或配送中心内的货物物流流动。 ASRS穿梭机经常用在具有多个存储级别的配送中心的仓库或库存集装箱中处理散装产品的托盘。 自动化存储和检索系统的定义是专门为物料的存…

springcloud-02-微服务间通信及熔断组件

第二章 微服务间通信及熔断组件 1. 微服务间通信组件 1.1 基于RestTemplate的服务调用 Spring框架提供的RestTemplate类可用于在应用中调用rest服务&#xff0c;它简化了与http服务的通信方式&#xff0c;统一了RESTful的标准&#xff0c;封装了http链接&#xff0c; 我们只…

初识 Node.js

1、回顾与思考 1.1、浏览器中的 JavaScript 的组成部分 1.2、思考&#xff1a;为什么 JavaScript 可以在浏览器中被执行 1.3、思考&#xff1a;为什么 JavaScript 可以操作 DOM 和 BOM 1.4、浏览器中的 JavaScript 运行环境 2、Node.js 简介 2.1、什么是 Node.js Node.js…

RSA加密算法完整加密流程

RSA完整加密流程总结1.1-RSA加密介绍RSA公钥加密算法是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。1987年7月首次在美国公布&#xff0c;当时…

实习------Spring 框架学习

Spring 是什么&#xff08;了解&#xff09; 在不同的语境中&#xff0c;Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度&#xff0c;对 Spring 进行介绍。 广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。 经过十多年的发展&…

【原创】升级需谨慎,开发两行泪!——记一次MySQL驱动包升级引发的事故

一、背景最近项目组在版本迭代时&#xff0c;组件也要进行升级&#xff0c;此时涉及到MySQL驱动包jdbc的版本升级。即从5.1.X升级到8.0.X。然鹅在上线之后就出现了一部分兼容性问题&#xff0c;造成了一次“事故”&#xff1a;调用接口出现“系统错误”。查看日志&#xff1a;j…

C. Least Prefix Sum(可以后悔的拿取+multiset)

Problem - C - Codeforces 波罗的海&#xff0c;一个著名的棋手&#xff0c;同时也是一个数学家&#xff0c;他有一个数组a1,a2,...,an&#xff0c;他可以进行以下几次&#xff08;可能是0次&#xff09;操作。 选择某个索引i&#xff08;1≤i≤n&#xff09;。 将ai与-1相乘&…

Ffmpeg中AVFrame数据保存成YUV--讨论AVFrame的linesize

目录 YUV播放器 AVFrame中保存成YUV实现 linesize的意义 实测(PC机-64bits-win10) 总结&#xff1a; YUV播放器 首先要有一个YUVplayer用来播放测试的YUV数据&#xff0c;雷神改良过的YUV播放器&#xff1a; 修改了一个YUV/RGB播放器_雷霄骅的博客-CSDN博客 播放器播放界…

查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示&#xff0c;这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。bin\pg_dump --dbnamepostgresql://dbuser:123456localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql pg_dump: 错误: 查询失败: 閿欒…

react生命周期(类组件/函数组件)

1.react代码模式分为两种 类组件和函数组件&#xff08;生命周期也有所不同&#xff09; 2.类组件&#xff08;写法如下&#xff09; import React from react export default class App1 extends React.Component{state {username:,password:}setUser (event) > {this.s…

《MySQL系列-InnoDB引擎12》启动、关闭与恢复

启动、关闭与恢复 InnoDB是MySQL数据库得存储引擎之一&#xff0c;因此InnoDB存储引擎得启动和关闭&#xff0c;可以说是MySQL实例得启动过程中对InnoDB存储引擎的处理过程。 在关闭时&#xff0c;参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、…

BIOS(控制权交接第一棒)

计算机系统的控制权&#xff08;CPU的使用权&#xff09;交接的第一棒是BIOS&#xff01;接下来&#xff0c;我们简单学习一下BIOS相关知识。 在计算机接电后按下开机键&#xff0c;首先运行的软件是基本输入输出系统&#xff08;Basic Input Output System&#xff0c;BIOS&a…

阿里云故障有感

2304阿里云故障有感 为什么会写一个如此奇怪的议题。 人的生活轨迹&#xff0c;不一定只有唯一的叙事方式&#xff0c;可以不那么苦&#xff0c;不那么累&#xff0c;不那么怕&#xff0c;不那么憋屈。 不再去追求宏大的叙事&#xff0c;而是去关心自己的感受&#xff0c;吃没…

Spring Boot学习篇(六)

Spring Boot学习篇(六) mybatis-plus使用篇(二) 1 新增 1.1 示例代码 AutowiredISongsService songsService; Testpublic void add(){Songs snew Songs(null,"11","xx",null,"xx歌曲","2020-02-12");songsService.save(s);System.…