N-Queens II N皇后问题(有几种放法)@LeetCode

四皇后问题(同理适用于n皇后问题)图片版 四皇后问题(同理适用于n皇后问题 图片版) 图片来源:《数据结构 C语言版》(严蔚敏 吴伟民 编著 )第151页 阅读详情

是上一题的follow-up,问有总共几种方法。用全局变量易得,但是在java中不能像C++那么方便地用引用或指针传primitive参数。所以我觉得用return value来记录方法数更好!


package Level4;

import java.util.ArrayList;

/**
 * N-Queens II
 * 
 * Follow up for N-Queens problem.
 * 
 * Now, instead outputting board configurations, return the total number of
 * distinct solutions.
 * 
 * http://www.leetcode.com/wp-content/uploads/2012/03/8-queens.png
 * 
 */
public class S52 {

	public static void main(String[] args) {
		System.out.println(totalNQueens(8));
	}

	public static int totalNQueens(int n) {
		int[] queenList = new int[n];
		return placeQueen(queenList, 0, n);
	}

	// 递归回溯8皇后,关键记录下到达了哪一行了
	public static int placeQueen(int[] queenList, int row, int n){
		// Base Case, 已经完成任务了
		if(row == n){
			return 1;
		}
		
		int cnt = 0;
		// 开始这一行的查找
		// 遍历第row行的所有列,测试哪一个位置是安全的
		for(int col=0; col<n; col++){
			if(isSafe(queenList, row, col)){
				queenList[row] = col;
				cnt += placeQueen(queenList, row+1, n);
			}
		}
		return cnt;
	}
	
	// 判断是否坐标(row,col)的位置是安全的(检查行,列,正反对角线)
	// queenList里面存放行,列坐标pair,即queenList[row] = col
	public static boolean isSafe(int[] queenList, int row, int col){
		for(int preRow=0; preRow<row; preRow++){
			int preCol = queenList[preRow];
			if(preRow == row){		// 理论上不必检查,因为preRow是总是小于row的
				return false;
			}
			if(preCol == col){			// 检查是否在同一列
				return false;
			}
			if(row-preRow == col-preCol){		// 反对角线
				return false;
			}
			if(preRow+preCol == row+col){		// 正对角线
				return false;
			}
		}
		return true;
	}
		
}


注意N Queen和Sudoku solver不一样的是N Queen可以就用int[] pos一维数组即可,而sudoku则用char[][] boarder二维数组

public class Solution {
    public int totalNQueens(int n) {
        int[] pos = new int[n];
        int[] cnt = {0};
        Arrays.fill(pos, -1);   // initialize to -1
        rec(pos, 0, cnt);
        return cnt[0];
    }
    
    // (row, pos[row])
    public void rec(int[] pos, int row, int[] cnt) {
        if(row >= pos.length) {
            cnt[0]++;
            return;
        }
        for(int col=0; col<pos.length; col++) {
            pos[row] = col;
            if(isValid(pos, row)) {
                rec(pos, row+1, cnt);
            }
            pos[row] = -1;
        }
    }
    
    public boolean isValid(int[] pos, int row) {
        for(int i=0; i<pos.length; i++) {
            if(pos[i] == -1) {      // notice we need to skip initialized status
        		continue;
        	}
            if(i != row && pos[i] == pos[row]) {
                return false;
            }
            if(i != row && Math.abs(row-i) == Math.abs(pos[row]-pos[i])) {
                return false;
            }
        }
        return true;
    }
}




回溯与搜索算法 回溯与搜索算法.回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。 立即下载

相关推荐

Qt实现N皇后算法的所有解

依次列出存在的解法

算法典型例题:N皇后问题,五种解法,逐步优化(非递归版)

本文将介绍N皇后问题的五种解法,包括朴素回溯法、对称优化、标记优化、可用优化、位运算优化,对于每种解题思路,提供相应的非递归版代码实现,最后将对每种解法进行测试,横向对比每种解法的求解时间。

QBoson的博客 3025

N皇后问题(二维数组)

主要是用二维数组的方式来进行对问题的求解,用二维数组来绘制每次放置的N皇后,然后再用一个新变量来记录回溯的点

N皇后问题:在N x N棋盘上摆N个皇后,有多少种摆法; 要求:任何两个皇后不同行、不同列,不在同一个45度斜线上,例如下面三种摆放方式不符合要求。

public class nqueen { public static void main(String[] args){ //皇后数设置为16 System.out.println(num(16)); } //计算n皇后有多少种放置位置 public static Long num(int n){ if(n < 1){ return Long.valueOf(0); ...

机器学习那些事儿-潘志锐(墨客) 2069

利用Qt实现的N皇后算法

利用Qt实现的N皇后算法,理论可以实现任意皇后的解法,可以单步演示每种解法。

用递归方法求解n皇后问题

print(int n):输出一个解。 place(int k ,int j):测试(k,j)位置能否摆放皇后

n皇后问题的三种解法

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。 n皇后问题不算是陈词滥调,也是老生常谈了,作为回溯的经典案例,有递归和非递归两种实现方式,同时,除了回溯算法,最近我在网上查了下看到还可以用位运算来解决这个问题。本次趁着本学期算法课程的期末要求,我将对两种算法的实验效果进行分析。 1、使用回溯解决n皇后问

IT修道者的专栏 7万+

N皇后问题答案求解QT实现(带源码)

N皇后问题求解 支持4—9皇后问题,修改源码调用参数和存储矩阵大小,可以支持更大棋盘求解。 QT新手,做的不好,ヾ(●´□`●)ノ【゜+。・o谢谢o・。+゜】ヾ(○´□`○)ノ

n皇后问题-回溯法求解

n皇后问题-回溯法求解 1.算法描述 在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 n皇后是由八皇后问题演变而来的。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76...

Pan的博客 7万+

qt实现n皇后问题(带界面)

界面还算合理,运行结果无误,可以看见搜索路径,注释还算详细。

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?

福哥答案2021-02-16: 自然智慧即可。 1.普通递归。有代码。 需要判断同列和斜线。 2.位运算递归。有代码。 3.我的递归。有代码。 只需要判断斜线。 代码用golang编写,代码如下: package main import ( "fmt" "time" ) func main() { n := 12 fmt.Println(n, "皇后问题") fmt.Println("------") now := time.Now() fmt.P

福大大架构师每日一题 2万+

C++实现八皇后问题的方法

本文实例展示了C++实现八皇后问题的方法,是数据结构与算法中非常经典的一个算法。分享给大家供大家参考之用。具体方法如下: 一般在八皇后问题中,我们要求解的是一个8*8的国际象棋棋盘中,放下8个皇后且互相不能攻击的排列总数。皇后的攻击范围为整行,整列,以及其斜对角线。 由于皇后的攻击范围特性,注定我们每行只能放下一个皇后,于是我们要做的只是逐行放下皇后。八皇后问题是回溯法的典型问题。这里我们用的方法很简单: 从第一行开始逐个检索安全位置摆放皇后,一旦有安全位置则考虑下一行的安全位置。如果发现某行没有安全位置,则返回上一行继续检索安全位置;如果发现在最后一行找到了安全位置则输出整个棋盘。 原理很简

四皇后问题(回溯法)

#include<stdio.h> int count = 0; int isCorrect(int i, int j, int (*Q)[4]) { int s, t; for(s=i,t=0; t<4; t++) if(Q[s][t]==1 && t!=j) return 0;//判断行 ...

little_spice的博客 5095

Cadence Virtuoso实战:3分钟搞定反相器参数化设计(附CDF配置避坑指南)

本文详细介绍了如何在Cadence Virtuoso中利用CDF参数传递功能实现反相器的参数化设计,包括PMOS和NMOS的基础搭建、CDF配置技巧及常见报错解决方案。通过实战案例和避坑指南,帮助工程师快速掌握高效设计方法,提升集成电路设计效率。

weixin_28292761的博客 334

别再只会调速度了!用STM32的定时器中断精准控制伺服电机转角(避坑指南)

本文详细介绍了如何利用STM32的定时器中断和PWM输出实现伺服电机的精准转角控制,避免常见的速度控制误区。通过硬件配置、脉冲计数逻辑和优化技巧的实战讲解,帮助开发者掌握高精度位置控制方法,适用于工业自动化和机器人控制等场景。

weixin_42531163的博客 414

n皇后问的三种解答方式

不用多说直接上代码#include #include #include #include using namespace std; /************************************************/ /*以地图的形式来打印出皇后的位置*/ /************************************************/ void disp

初学者 3625

基于FPGA的PCIe核系列:FPGA root模式生成工程例子分析(1)

一、 PCIE系统架构 1.1 PCIE分层结构 PCIE结构 1.2 TLP包 四种TLP类型。 Memory (内存空间操作) IO (IO空间操作) Configuration (配置操作) Message (信息操作) 四种类型TLP,如果有需要响应,称为Non-Posted TLP,如果没有需要响应,称为Posted TLP。 TLP包类型 1.2.1 TLP结构 TLP数据格式 1.2.2 Header各个字段的含义 Header格式 ...

huangshanhu的博客 3432

[回溯法] 四皇后问题

这里写目录标题问题要求思路算法 问题 四皇后问题是一张四乘四的棋盘,在棋盘中放四颗棋子,要求如下:任意两个皇后都不能处在同一行、同一列 任意两个皇后都不能处在同一斜线上(主斜线、反斜线)。 四皇后是八皇后的衍生版本,其原理都是一样的。八皇后说的是在8×8的国际棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?八皇后一共有92种解法。而四皇后是...

weixin_43809545的博客 1万+

【半导体工业实战】C#.NET开发SECS/GEM协议上位机(完整可运行源码+全进制转换工具类+工业级通信封装)

在半导体这个高精尖的工业领域,SECS/GEM协议是设备通信的基石,而C#.NET凭借其稳定性、高效的字节处理能力、Windows工控机的深度适配,成为SECS上位机开发的最优选择。本文从半导体行业的专属认知出发,提供了完整的进制转换工具类、工业级的SECS通信封装、实战的报文解析与业务调用示例、半导体专属的避坑指南,所有内容均为真实项目经验的沉淀,无空洞理论、无AI冗余文字,所有源码均可直接编译运行、无缝移植到半导体项目中。半导体工控开发的核心,从来不是炫技,而是。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 897

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 305

算法:皇后问题

问题 国际象棋中的皇后,可以横向、纵向、斜向移动。如何在一个NXN的棋盘上放置N个皇后,使得任意两个皇后都不在同一条横线、竖线、斜线方向上? 举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子: 递归回溯法 package main import "fmt" const N = 4; // 第1个N是由几行, 第2个N是有几列 var queue [N][N]int func show() { for i := 0; i < N; i++ { //

OceanStar的博客 4438

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 904
上一篇: 关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题
下一篇: 如何学习JavaScript
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值