回溯法(排列树)解决八(N)皇后问题

3.2 回溯法—N皇后问题 1. 问题描述 在n×nn\times nn×n的棋盘上摆放nnn个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上 2. 问题分析 下以求解4皇后问题为例,分析4皇后问题的排列树以及回溯过程: 搜索及回溯过程: 解空间树: 3. 算法设计 1. 算法思想 ①用数组x[]存放皇后的位置,x[k]表示第k个皇后放置的位置 ②先在第一行放置第1个皇后,然后依2、3、…、n的次序放置其他皇后,当第n个皇后放置好后产生要给可行解(为得到所有解,还需要继续试探第n个皇后的下一个位置) ③在试探第k(k 阅读详情

回溯法(排列树)解决八(N)皇后问题

问题描述:

八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直
接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的
n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。
                                                                      
                                                                        ---------来自<维基百科>

个人思路:

  • max表示n个皇后 用array[n]表示皇后在第n+1行,array[n]列,比如array[0] = 8 意思为:该皇后位于第1行第8列的坐标;
  • 思路:

  1. 排列树与子集树的区别在于子集树不需要初始化而排列树需要,此初始化内容为众多可能解集合(注:是可能解,不一定为正确解)中的一个
  2. 初始化为a[]数组(1-n随意排列);

  1. 将a数组的值向array中输出,初始传入n为0;表示该皇后在第一行,但具体哪列不确定,此时初始化的a数组就起到了作用,a[n]表示在n+1行的第a[n]列, 将其赋值给array,即: array[n] = a[i];

    (因为a[]中只是可能性,所以要将所有可能性用for循环表示.即:for(int i = n;i < max ; i++);

    代码:

  1. 然后更新a数组 swap(a,n,i) (意为 既然已经使用过a[i]那就用原本的a[n]替换a[i] 保证列值不重复)
  2. 更新后判断该位置是否与已经存在的皇后的位置冲突(同斜线) 已经通过a数组和n已经去除掉同行同列的可能;n保证不同行,a[i]保证不同列;
  3. 如果合法,则进入n+1;重复讨论n+2个皇后的位置 /如果不合法,交换回之前位置(只有合法之后才能占该列值) i++;
  4. 当i++到for循环结束,也就是说该皇后在这一行所有列中都没有找到合适自己的位置,回退,即该方法执行结束,重新讨论之前上个皇后的位置;

代码如下:

public class NQueen {

int max = 8;
int array[] = new int[max];
int[] a = { 8, 2, 3, 4, 5, 6, 7, 1 };

public void backtrack(int n) {
	if (n == max) {
		print();
		return;
	} else {
		for (int i = n; i < max; i++) {
			array[n] = a[i];
			swap(a, n, i);
			if (nice(n)) {
				backtrack(n + 1);
			}
			swap(a, n, i);
		}
	}

}

public boolean nice(int n) {
	for (int i = 0; i < n; i++) {
		if (Math.abs(n - i) == Math.abs(array[n] - array[i])) {
			return false;
		}
	}
	return true;
}

public void swap(int[] a, int i, int j) {
	int tem = a[i];
	a[i] = a[j];
	a[j] = tem;
}

int k = 0;

public void print() {
	++k;
	System.out.print("第" + k + "种解法:");
	for (int i = 0; i < array.length; i++) {
		System.out.print(array[i] + " ");
	}
	System.out.println();
}

public static void main(String[] args) {

	new NQueen().backtrack(0);
}
}
回溯法特点分析以及经典N皇后问题 /*以深度优先的方式系统地搜索问题的解的算法称为回溯法它适用于解一些组合数较大的问题*//*在用回溯法搜索解空间树的时候,通常采用两种策略来避免无效搜索,提高回溯法的搜索效率。其一是用约束函数在扩展结点处剪去不满足约束的子树,其二是用限界函数剪去不能得到最优解的子树。这两类函数统称为剪枝函数。运用回溯法的三个步骤:(1)针对所给问题,定义问题的解空间(2)确定易于搜索的解空间结构,子集树还是排列树 阅读详情

相关推荐

回溯法算法步骤&n皇后问题的详细程序(C++)

/* 回溯法有“通用解题法”之称,可以系统的搜索问题的所有解,既有系统性也有跳跃性。 它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至洁空间树 的任一结点时,先判断该结点是否包括该问题的解,如果肯定不包含,则跳过对以该结点为 根的子树的搜索,逐层向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。   回溯法解题的三个步骤:   (1)针对所给问

1万+

回溯法解决8皇后问题

1、皇后问题解决思路:使用回溯法解决,也就是通常所说的利用树的深度优先搜索求解。即沿着一条路径往下走,如果走不通,那就往回走,尝试另一条路径。 皇后问题的求解过程中,每一个树结点都可以看做是棋局的局部布局或者是完整布局。根结点表示棋局的原始状态,没有任何棋子。之后的层与层之间表示一种状态转换,状态转换的过程就是构造树的过程,也就是树的深度优先搜索的过程。在状态转换的任何时刻,都需要满足约束条件:任...

m0_37683327的博客 916

回溯算法:子集树和排列树

本文参考了其他博文,参考出附上了原文链接。侵权联系我删除! 1.算法介绍 回溯算法是一个既带有系统性,又带有跳跃性的搜索算法: 系统性:它在包含问题的所有解空间树中,按照深度优先策略,从根节点出发搜索解空间树 跳跃性:算法搜索至解空间树的任一节点时,判断该节点为根的子树是否包含问题的解,如果肯定不包含,则跳过搜索以该节点为根的子树的搜索,逐层向其祖先节点回溯。否则进入该子树,继续按深度优先...

zangqijie123的博客 3714

【算法学习笔记】1:回溯法中子集树与排列树(装载/最大团/n皇后/旅行商)

解空间就是所有解的可能取值构成的空间, 一个解往往包含了得到这个解的每一步,往往就是对应解空间树中一条从根节点到叶节点的路径。 子集树和排列树都是一种解空间,它们不是真实存在的数据结构,也就是说并不是真的有这样一棵树,只是抽象出的解空间树。 约束条件Constraint是问题中就限定好的条件,比如在装载问题中装入第i个物体后不能超过背包总容量时才考虑装入它,即搜索左子树的情况。 限界条件Bound是需要自己挖掘的一个

大桔骑士的学习笔记 7695

回溯法原理及应用

回溯的基本原理: 在问题的解空间中,按深度优先遍历策略,从根节点出发搜索解空间树。算法搜索至解空间的任意一个节点时,先判断该节点是否包含问题的解。如果肯定不包含,跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯,否则进入该子树,继续深度优先搜索。   回溯法解问题的所有

gls_liujia的专栏 6649

现控报告-- 分析倒立摆系统稳定性、能控性及能观性分析,设计PID控制方案(附matlab)

建立直线一级倒立摆系统的动力学模型,推导该系统的运动方程,求出直线一级倒立摆系统传递函数模型及空间状态方程模型。接着描述了PID控制系统设计原理及PID控制器各校正环节的作用,简要叙述了参数的整定方法。设计了直线一级倒立摆摆杆摆角及小车位置常规单回路控制器,通过Simulink仿真知道常规单回路控制器能控制摆杆摆角,不能控制小车位置。于是设计出了直线一级倒立摆双闭环控制器及基于倒立摆系统的状态空间方程控制器,利用软件进行仿真,仿真结果表明,常规双闭环控制方案和基于状态空间方程加控制方案均能对摆杆摆角及小车位

mengshenglo的博客 4万+

n皇后--排列树和子集树解法并输出安排方案(细节分析)

1.问题描述:把n个皇后放在n*n的棋盘上,要求皇后不能同行同列或者在一条对角线上 2.想法:如果使用子集树方法,从第一行开始放皇后,然后第二行继续放,直到放到第n行,放置de

weixin_50987760的博客 1069

华为HCIP-001:PPPOE配置模拟实验

华为HCIP01:PPPOE配置模拟实验 实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 Th

兔子乖乖 1802

N皇后问题的排列树做法(递归&非递归)

回溯法,俗称暴力搜索。用排列树的方法的话实际上是枚举全排列,因为皇后不可能在同一列,因此列数不可能一样因此可以使用全排列的方式来做这道题目。

weixin_61704900的博客 1714

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1951

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 853

回溯法、分支限界法解决N皇后问题

本期是针对解决 N 皇后问题的回溯法和分支限界法两块代码,分析了其解的形式(二维列表,元素取值 0 或 1 表示有无皇后)、解的空间结构(排列树,各层对应放置皇后决策,根节点初始态,树高为 N,路径对应解)及搜索条件(放置皇后合法性、回溯控制或分支选择条件、解完成判断条件等方面各自特点)。

2301_80050457的博客 2836

逆向工程实战:解密AppleAccount的X-MMe-Nas-Qualify签名生成机制

本文通过逆向工程实战,详细解析了AppleAccount服务中X-MMe-Nas-Qualify签名的生成机制。作者利用Frida进行动态追踪定位签名源头,结合IDA Pro进行静态分析,并借助LLDB动态调试还原核心算法。文章最终分享了如何独立于苹果官方库,通过Python代码复现签名算法,为自动化测试和深度交互苹果服务的开发者提供了关键技术路径。

weixin_29323049的博客 708

回溯法-排列树-n皇后问题

N皇后问题: 在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。思路:首先要确定皇后间位置合法的检验表达式。((abs(i-k)==abs(x[i]-x[k]))||x[i]==x[k]) //x[i]表示i皇后在第x[i]列;abs(i-k)==abs(x[i]-x[k])表示在两皇后在同一对角线上。然后每第i皇后在第i行有n个...

lfbcsdn博客 4181

05 - GRACE数据处理-球谐展开与球谐综合

GRACE数据处理-球谐展开和综合前面在介绍GRACE相关理论的时候提到过下面的公式,从公式形式上可以看出,面密度变化和球谐系数(CS)之间是能够相互转换的,那这个转化的过程可以称为球谐展开,简单理解就是将全球网格数据转化为球谐系数的过程。而球谐综合可以看作是球谐展开的逆过程,利用球谐系数计算到全球格网分布。

weixin_43339605的博客 1050

AD快速上手笔记

本文详细介绍了使用Altium Designer从零创建PCB项目全流程:新建工程、绘制原理图(元件放置、连线、电源端口)、编译检查、生成PCB、布局布线(含铺铜)、DRC检查及输出Gerber与钻孔文件。重点强调了库选择、参数修改、层切换、铺铜设置和生产文件导出规范,确保设计无误,便于顺利下单生产。

qq_53529450的博客 42

回溯法--n皇后问题

经典的n皇后问题 回溯法有两个模板--子集树、排列树,他们有回溯法的共同特点:深度优先搜索,如果一条路走不通,再退回来(类似递归)

m0_56147044的博客 5416

Python爬虫实战:逆向工程与异步爬虫技术,高效抓取国家知识产权局专利数据

相比于传统的Selenium,Playwright由微软开发,支持多浏览器(Chromium, Firefox, WebKit),API更现代,执行速度更快,并且能轻松录制用户操作生成代码。通常,列表中的摘要信息是缩略的,我们需要进入每个专利的详情页获取完整信息(如主权要求、法律状态等)。我们的第一步是手动操作一遍搜索流程,并用Playwright的“录制”功能或开发者工具,找出真正返回专利数据的那一个或多个网络请求。以友好的、对人类行为模拟的方式爬取数据是基本的网络礼仪,也能有效避免你的IP被封锁。

2201_76125261的博客 2423

详解回溯法

文章目录回溯法概念适用条件解题步骤回溯法和DFS的区别常见题型素数环迭代递归 回溯法 references: 回溯算法 回溯算法 详细讲解回溯算法(一) 回溯法-素数环问题 素数环(java实现) 概念 回溯(backtracking)法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满...

LynnWonder 5164

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

回溯法:N皇后问题

八皇后问题是十九世纪著名的数学家高斯于1850年提出的。 • 问题是:在8×8的棋盘上摆放八个皇后, 使其不能互相攻击, 即任意两个皇后都不能处于同一行、 同一列或同一斜线上。 • n皇后问题:即在n× n的棋盘上摆放n个皇后, 使任意两个皇后都不能处于同一行、 同一列或同一斜线上。

weixin_50917576的博客 2413

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

回溯法——N皇后问题与TSP问题

回溯法——N皇后问题与TSP问题 对于一般的问题而言,很多时候无法找到其最优子结构性质或者其不是一个最优化问题,这些问题都是NP的。我们无法采用像动态规划一样的技巧简化求出某个具体解的过程,唯一能做的就是蛮力遍历所有可能的解。在蛮力法的基础上,假如把求每个解的过程组织成一个树状结构,从根节点到叶节点的每次遍历就是一个可能解,那么就可以采用深搜+剪枝的方式来简化计算,在计算之前就知道某些解是不可行的,因此可以说回溯法是特殊情况下对蛮力法的优化。 问题: N后问题:在N×N的棋盘中放置N个皇后,使得任何两个皇后

qq_43513855的博客 1163

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

N皇后问题(子集树、排列树回溯法)

> 这题既可以采用子集树也可用排列树 问题描述 解向量 可行性约束 限界约束 代码一:子集树解决 #include <iostream> using namespace std; int x[100]; //皇后的位置(i,x[i]),即x[i]表示皇后在i行的列位置 int n; //棋盘规格 int sum = 0; bool Place(int t) //实现限界约束判断 { for (int i = 1; i <t;i++)

qq_47299421的博客 4487

【回溯法】用子集树和排序树解决n后问题

回溯法 在问题的解空间树中,按深度优先策略,根节点触发搜索解空间树,算法搜索至解空间的任意节点时,先判断该节点是否包含问题的解,若肯定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先结点回溯。否则进入该子树,继续按根深度优先搜索 子集树和排列树的区别 当所给问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。子集树的时间复杂度为2^n 当所给的问题时确定n个元素满...

ganlubaba666的博客 3368

带预判的穷举法——回溯法及其应用:n皇后问题

回溯法也是算法中比较重要的,是一种试探法,和蛮力法差不多。 回溯法与蛮力法的区别就是,回溯法有预判功能,一旦前方经过计算不满足约束条件或者前方不可能再具有最优解,则回头从另一方向进行搜索。 回溯法一般的解空间是用一棵树表示的。 我们再上一篇稍稍提到了回溯法的这个词汇,本篇来介绍回溯法的概念。 回溯法和蛮力法(穷举法)是差不多的算法。回溯法也是一个一个试探,然后找到一个最优解的算法。但是它们的最大...

qq_41926985的博客 2042

n皇后问题

问题描述: 在nXn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于,在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 算法分析 此题用回溯法求解,可以构造排列树解空间, 解向量:(x1,x2,…,xn) 显约束:x=1,2…n 隐约束: (1)不同列:xi≠xj (2)不处于同一正、反对角线:|i-j|!=|xi-xj| ...

One of thre_tigers的博客 1401
下一篇: Java反射机制笔记
Tony__Java
博客等级 码龄9年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值