51. N 皇后

news2024/12/23 13:41:12

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 stub
		int 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 stub
		if(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 stub
		for(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 stub
		int 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://www.coloradmin.cn/o/135432.html

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

相关文章

剑指offer----C语言版----第七天

目录 1. 旋转数组中的最小数字 1.1 题目描述 1.2 思路一 1.3 思路二 1.4 小试牛刀 1. 旋转数组中的最小数字 原题链接&#xff1a; 剑指 Offer 11. 旋转数组的最小数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-…

GCC学习笔记

&#xff08;1&#xff09;什么是GCC &#xff08;2&#xff09;用gcc编译文件 gcc test.c -o app 【编译test.c文件得到app可执行文件】 ./app 【运行可执行文件】 &#xff08;3&#xff09;编程语言的发展 &#xff08;4&#xff09;gcc工作流程 预处理 作用&#xff1a;…

剑指 Offer 26. 树的子结构

题目 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 给定的树 B&#xff1a; 返回 true&#xff0c;因为 B 与 A 的一个子树拥有相同的结构和节…

JavaScript中如何将十进制转换为十六进制?

​ 在本文中&#xff0c;我们将学习如何在 JavaScript 中轻松地将十进制数转换为其等效的十六进制数。 我们将研究一些需要执行此操作的真实场景。 数字toString() 方法 要在 JavaScript 中将十进制转换为十六进制&#xff0c;请对十进制调用 toString() 方法&#xff0c;将 1…

JUC并发编程学习笔记(四)callable接口与辅助类

6 Callable&Future 接口 6.1 Callable 接口 创建线程的多种方式&#xff1a; 继承Thread类实现Runnable接口Callable接口线程池 ​ 目前我们学习了有两种创建线程的方法一种是通过创建 Thread 类&#xff0c;另一种是通过使用 Runnable 创建线程。但是&#xff0c;Runn…

某电视 频道headers参数x-itouchtv-ca-signature逆向

本文仅供参考学习&#xff0c;如有侵权可联系本人 某电视(荔枝平台)平台逆向 目标链接 aHR0cHM6Ly93d3cuZ2R0di5jbi9jaGFubmVsRGV0YWlsLzI0Ng接口链接&#xff1a; aHR0cHM6Ly9nZHR2LWFwaS5nZHR2LmNuL2FwaS9jaGFubmVsL3YxL25ld3M/cGFnZVNpemU9NDAmY2hhbm5lbElkPTI0NiZjdXJy…

纯注解驱动SSM整合

纯注解驱动SSM整合 Jdbc.java package com.itheima.confing;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class J…

思购趣拼秒杀模式的逻辑与模式特点

读&#xff1a;小镇上来了一个陌生的年轻人&#xff0c;年轻人交了一百块定金给旅馆的老板去楼上挑房间&#xff0c;旅馆老板拿着这一百块钱还给了卖猪肉的&#xff0c;卖猪肉的把钱还给了卖饲料的&#xff0c;卖饲料的把钱还了厂商&#xff0c;厂商拿着钱还给了按摩店的小姐&a…

一文说清MySQL索引数据结构

前言 接上篇说到&#xff0c;小A匆匆忙忙的赶回宿舍&#xff0c;因为晚上他要给女神整理讲解MySQL中索引数据结构资料。一边整理一边忍住不笑了起来&#xff0c;等小美看到这篇文章不得爱上自己。当上小美男朋友&#xff0c;从此踏上人生巅峰不是梦&#xff08;该考虑一下孩子…

C#,图像二值化(12)——基于谷底最小值的全局阈值算法与源代码

1、基于谷底最小值的阈值 这个方法适用于通过有限的迭代次数&#xff0c;平滑后能得到双峰的图像&#xff0c;让双峰的谷底成为阈值。当执行完基于谷底最小值的阈值操作的时候&#xff0c;改变了直方图信息&#xff0c;使之成为处理过后的直方图信息&#xff0c;这时候显示Doc…

LeetCodeday05

面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; public class Leetcode0207 {public static void main(…

ChatGPT背后的模型

文章目录1.RLHF方法2.ChatGPT中的RLHF方法2.1 微调模型GPT-32.2 训练奖励模型2.3 利用强化学习进一步微调语言模型3.效果4.面临挑战5.参考InstructGPT语言模型&#xff0c;是一个比 GPT-3 更善于遵循用户意图&#xff0c;同时使用通过我们的对齐研究开发的技术使它们更真实、毒…

应急/linux 挂D盾扫描方法

0x00 linux 挂D盾扫描方法 这个方法可以解决Linux下无法使用D盾查杀webshell的困扰 利用ssh将Linux文件系统挂在到win上面&#xff0c;然后扫描就好了 0x01 环境安装 安装D盾 D盾都用过吧&#xff0c;应急经常用来扫一下是否存在 Webshell D盾下载地址 D盾防火墙 (d99ne…

python 性能优化

文章目录性能测试运行速度内存消耗并行加速分布式并行多线程多进程框架即时编译njitcase1 计算熵case2 找到最大概率类别case3 计算两两准确率GPU使用工具关于程序优化的第一个准则是“不要优化”&#xff0c;第二个准则是“不要优化那些无关紧要的部分”。性能测试 性能测试是…

4种FPGA时钟分频 【附源码】:1.偶数分频;2.奇数分频(占空比50%);3.奇数分频(任意无占空比);4.小数分频;

题目来源于牛客网&#xff0c;完整工程源码&#xff1a;https://github.com/ningbo99128/verilog 目录 VL37 偶数分频 VL40 奇数分频&#xff08;占空比50%&#xff09; VL42 奇数分频&#xff08;任意无占空比&#xff09; VL41 任意小数分频 VL37 偶数分频 题目介绍 请…

https的相关知识,为什么https更加安全,为什么要对称与非对称加密,非对称加密的算法

目录 https相比于http更加安全&#xff0c;三个优势&#xff1a; 下面是一些必须知道的问题 1.对称加密与非对称加密&#xff1a; 2.对称加密的密钥SK如何产生和传输&#xff1a; 3.https有两套非对称加密 4.https的哈希一共用于两个地方 5.https的整个流程 https相比于ht…

ElasticSearch数据实时性原理分析与持久化

问题复现 现在有这么一种业务场景&#xff0c;需要将海量的数据通过Hive进行数据清洗并统计&#xff0c;最后落库到ES中&#xff0c;因为需要支持大数据量的分词&#xff0c;模糊搜索&#xff0c;所以考虑用ES而不直接放到Mysql中&#xff0c;前端需要直接对数据进行交互&…

Redis的自增也能实现滑动窗口限流?

文章目录限流核心原理以及代码基于Spring切面实现的注解版本限流是大家开发之路上一定会遇到的需求。比如&#xff1a;限制一定时间内&#xff0c;接口请求请求频率&#xff1b;一定时间内用户发言、评论次数等等&#xff0c;类似于滑动窗口算法。这里分享一份拿来即用的代码&a…

buildroot构建hisi平台根文件系统和工具链

buildroot构建hisi平台根文件系统和工具链 前面使用了arm-hisiv300-linux 工具链来作为Buildroot的外部工具链进行编译&#xff0c;然后遇到了很多编译问题。 https://blog.csdn.net/duapple/article/details/128516133?spm1001.2014.3001.5501 这里不使用hisi的工具链&…

Seata简介

小结&#xff1a; nacos 【name server】&#xff1a;注册中心&#xff0c;解决服务的注册与发现 nacos【config】&#xff1a;配置中心&#xff0c;微服务配置文件的中心化管理&#xff0c;同时配置信息的动态刷新 Ribbon&#xff1a;客户端负载均衡器&#xff0c;解决微服务集…