51. N 皇后

article/2025/10/14 4:09:59

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 <= n <= 9

思路:(回溯)

在 n*n 的矩阵中摆放 n 个皇后,并且每个皇后不能在同一行,同一列,同一对角线上,求所有的 n 皇后的解。
法一 :暴力求解;
法二 : 一行一行地摆放,在确定一行中的那个皇后应该摆在哪一列时,需要用三个标记数组来确定某一列是否合法,这三个标记数组分别为:列标记数组、45 度对角线标记数组和 135 度对角线标记数组。

  • 45 度对角线标记数组的长度为 2 * n - 1,通过下图可以明确 (r, c) 的位置所在的数组下标为 r + c:
    在这里插入图片描述
  • 135 度对角线标记数组的长度也是 2 * n - 1,(r, c) 的位置所在的数组下标为 n - 1 - (r - c)。
  • 在这里插入图片描述

代码:(Java)

法一:
import java.util.ArrayList;
import java.util.List;public class Nqueen {public static void main(String[] args) {// TODO Auto-generated method stubint n = 4;System.out.println(solveNQueens(n));}private static int N;public static List<List<String>> solveNQueens(int n) {List<List<String>> combinations = new ArrayList<>();List<String> combination = new ArrayList<>();char [][] Q = new char[n][n];N = n;backtracking(combinations, combination, Q, 0);return combinations;}private static void backtracking(List<List<String>> combinations, List<String> combination, char[][] Q, int r) {// TODO Auto-generated method stubif(r == N) {combinations.add(new ArrayList<>(combination));return;}for(int i = 0; i < N; i++) {if(!tookup(r, i, Q)) {continue;}Q[r][i] = 'Q';StringBuffer s = new StringBuffer();for(int j = 0; j < N; j++) {if(j != i) {s.append(".");}else {s.append("Q");}}combination.add(s.toString());backtracking(combinations, combination, Q, r + 1);Q[r][i] = ' ';combination.remove(combination.size() - 1);}}private static boolean tookup(int r, int c, char[][] Q) {// TODO Auto-generated method stubfor(int i = 0; i < N; i++) {if(Q[r][i] == 'Q' || Q[i][c] == 'Q') {return false;}if(r-i >= 0 && c-i >= 0 && Q[r-i][c-i] == 'Q')return false;if(r+i < N && c+i < N && Q[r+i][c+i] == 'Q')return false;if(r+i < N && c-i >= 0 && Q[r+i][c-i] == 'Q')return false;if(r-i >= 0 && c+i < N && Q[r-i][c+i] == 'Q')return false;}return true;}
}
法二:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Nqueen {public static void main(String[] args) {// TODO Auto-generated method stubint n = 4;System.out.println(solveNQueens(n));}private static List<List<String>> solutions;private static char[][] nQueens;private static boolean[] colUsed;private static boolean[] diagonals45Used;private static boolean[] diagonals135Used;private static int N;public static List<List<String>> solveNQueens(int n) {solutions = new ArrayList<>();nQueens = new char[n][n];for (int i = 0; i < n; i++) {Arrays.fill(nQueens[i], '.');}colUsed = new boolean[n];diagonals45Used = new boolean[2 * n - 1];diagonals135Used = new boolean[2 * n - 1];N = n;backtracking(0);return solutions;}private static void backtracking(int row) {if (row == N) {List<String> list = new ArrayList<>();for (char[] chars : nQueens) {list.add(new String(chars));}solutions.add(list);return;}for (int col = 0; col < N; col++) {int diagonals45Idx = row + col;int diagonals135Idx = N - 1 - (row - col);if (colUsed[col] || diagonals45Used[diagonals45Idx] || diagonals135Used[diagonals135Idx]) {continue;}nQueens[row][col] = 'Q';colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = true;backtracking(row + 1);colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = false;nQueens[row][col] = '.';}}
}

运行结果:

在这里插入图片描述

注:仅供学习参考!

题目来源:力扣.


http://chatgpt.dhexx.cn/article/OMuHhvvD.shtml

相关文章

51. N皇后

51. N皇后 https://leetcode-cn.com/problems/n-queens/ 四皇后的解 n个皇后&#xff0c; nn 的棋盘上 根据要求 每行有且仅有一个皇后&#xff08;如果有一行没有那么必有一行至少两个皇后&#xff0c;不符合&#xff09; 递归回溯&#xff0c;每次尝试在一行中摆放皇后&…

递归算法——n皇后

** 递归算法——n皇后 ** n皇后问题&#xff1a; 输入整数n&#xff0c;要求n个国际象棋的皇后&#xff0c;摆在n*n的棋盘上&#xff0c;互相不能攻击&#xff0c;输出全部方案。 输入&#xff1a; 输入一个正整数N。 输出&#xff1a; 程序输出N皇后问题的全部摆法。 行里…

kettle连接mysql教程_KETTLE初学者使用教程

Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新:kettle会自动对比用户设置的对比字段,若目标表不存在该字段,则新插入该条记录。若存在,则更新。 Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳…

Kettle Spoon 安装配置详解

文章目录 1 概述2 安装2.1 软件下载2.2 JDK 环境变量配置2.3 数据库驱动包下载2.4 双击 Spoon.bat 启动 3 简单使用3.1 transformation 转换3.1.1 文件 - 新建 - 转换3.1.2 核心对象 - 输入 - 表输入3.1.3 核对对象 - 输出 - 插入/更新3.1.4 保存 - xxx.ktr 3.2 job 作业3.2.1 …

Spoon安装步骤

主数据库连接步骤 主对象树点击转换&#xff0c;双击DB连接 配置信息完成后点击测试成功 二&#xff0e;源数据库连接步骤 1.点击Connect,点击other repositories 2.点击Database Repository 编辑名称&#xff08;注意必须用英文&#xff09; 再点击数据库连接 配置选项 …

kettle下载安装使用教程

Kettle简介 Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c; 数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一个壶里&#xff0c;然后以一种指定的格式流出。K…

KETTLE使用教程

Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新&#xff1a;kettle会自动对比用户设置的对比字段&#xff0c;若目标表不存在该字段&#xff0c;则新插入该条记录。若存在&#xff0c;则更新。 Kettle简介&#xff1a;Kettle是一款国外开源的ETL工具&#xff0…

spoon mysql教程_kettle 教程(一):简介及入门

介绍 kettle 是纯 java 开发&#xff0c;开源的 ETL工具&#xff0c;用于数据库间的数据迁移 。可以在 Linux、windows、unix 中运行。有图形界面&#xff0c;也有命令脚本还可以二次开发。 安装 这边以 windows 下的配置为例&#xff0c;linux 下配置类似。 jdk 安装及配置环境…

kettle基础使用教程

文章目录 前言一、下载、安装二、启动软件三、转换的使用教程四、作业的使用教程总结 前言 Kettle简介&#xff1a;Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&…

ETL工具-Kettle Spoon教程

转自&#xff1a;https://blog.csdn.net/liaomin416100569/article/details/82798879 一 。Kettle Spoon简介 ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;&#xff0c;对于企业或行业应用来说&#xff0c;我们经常会遇…

KETTLE 使用教程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新&#xff1a;kettle会自动对比用户设置的对比字段&#xff0c;若目标表…

spoon mysql教程_Kettle-Spoon入门示例

Spoon 是Kettle的设计调试工具 1.驱动: a) 驱动错误 b) 驱动添加 2.端口错误&#xff1a;连接数据库端口不对 3.正常连接 4.表输入 a) 新建一个表输入&#xff0c;获取数据库表的数据 b) 预览数据 c) 当前表数据输出到另外一个同样的表 d) 当前表数据输出到另外一个同样的表 e)…

数据库转换工具 spoon使用

由于项目需求 需要把oracle数据库转换为mysql数据库&#xff0c;所以使用spoon转换&#xff0c;简单快捷 ETL Kettle Spoon简介 ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;&#xff0c;对于企业或行业应用来说&#…

spoon mysql教程_spoon新手入门教程

Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一个壶里&#xff0c;然后以一种指定的格式流出。Kettle这个ETL工…

Kettle工具简单使用(spoon)

1、添加测试数据 在navicat中随便找个表当做被转化的数据进行测试&#xff0c;以下表为例&#xff1a; 在SQL server数据库中创建表 2、下载spoon软件 下载路径&#xff1a;https://download.csdn.net/download/qq_57404736/85013576 打开文件夹&#xff0c;双击spoon.ba…

Spoon工具的使用

Spoon工具的使用 第一步 建立中间表 create table table_name ( code varchar(100), name varchar(100) )第二步 新建转换 在核心对象 输入中找到表输入双击&#xff0c; 输出中找到表输出双击 第三步&#xff0c;双击表输入进入该界面 点新建进入如下界面 填写信息后点T…

spoon入门教程

Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一个壶里&#xff0c;然后以一种指定的格式流出。Kettle这个ETL工…

Spoon工具使用(kettle进行实时同步数据)

文章目录 Spoon工具使用&#xff08;kettle进行实时同步数据&#xff09;安装相关概念转换DB连接步骤和节点连接 作业DB连接作业项目 Spoon工具使用&#xff08;kettle进行实时同步数据&#xff09; 安装 解压完Spoon安装包后&#xff0c;双击.bat文件打开 相关概念 转换…

Kettle Spoon入门教程

Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。其中&#xff0c;Spoon是Kettle中的一个组件&#xff0c;其他组件有PAN&#xff0c;CHEF&#xff0c;Encr和KITCHEN等。 Spoon通过图形化的页…

nethogs查看每个进程流量

sudo nethogs 找到每个进程消耗流量的pid 通过ps -ef | grep pid 来查看对应的任务。 再如&#xff1a; datanode带宽打满&#xff0c;会导致dn写数据非常慢 参考链接&#xff1a;每天学习一个命令&#xff1a;使用 nethogs 查看每个进程流量