N皇后问题

n皇后问题 n皇后问题 在 n×nn×nn×n 的国际象棋棋盘中放 nnn 个皇后,使得任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的任意棋子。 模型建立 将 nnn 个皇后从 111 ~ nnn 编号,第 iii 个皇后的位置设定为第 iii 行,第 xix_ixi​ 列,坐标 (i,xi)(i, x_i)(i,xi​)。 要使得任意两个皇后都不能相互吃掉,那么 (1,x1)(1, x_1)(1,x1​)、(2,x2)(2, x_2)(2,x2​)、… 、(n,xn)(n, x_n)( 阅读详情

 求解N皇后问题是算法中回溯法应用的一个经典案例,回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。(参:http://blog.youkuaiyun.com/hackbuteer1/article/details/6657109,http://www.cnblogs.com/yanlingyin/archive/2011/12/19/2292041.html)

把棋盘存储为一个N维数组a[N],数组中第i个元素的值代表第i行的皇后位置,这样便可以把问题的空间规模压缩为一维O(N),在判断是否冲突时也很简单,首先每行只有一个皇后,且在数组中只占据一个元素的位置,行冲突就不存在了,其次是列冲突,判断一下是否有a[i]与当前要放置皇后的列j相等即可。至于斜线冲突,通过观察可以发现所有在斜线上冲突的皇后的位置都有规律即它们所在的行列互减的绝对值相等,即| row – i | = | col – a[i] | 。这样某个位置是否可以放置皇后的问题已经解决。


下面是用递归的方式解决N皇后问题:

#include <iostream>
#include <cmath>
using namespace std;

const int n = 8;//皇后的个数
int a[n];//棋盘个数,n为皇后的行标,a[n]对应的值为皇后的列标
int number = 0;//一共有多少方案

void queen(int row);//递归放置皇后
void printQueen();//打印皇后方案
bool can_place(int row);//判断是否放置皇后

void main()
{
	queen(0);//从第一行开始查找皇后

}
void queen(int row)
{
	if (n == row)
	{
		printQueen();
	}
	else
	{
		for (int j = 0; j < n; ++j)
		{
			a[row] = j;
			if (can_place(row))//第row行插入皇后成功者进入下一行,否则转到该行的下一列即++j
			{
				queen(row + 1);
			}
		}

	}

}
void printQueen()
{
	++number;
	for (int i = 0; i < n; ++i)
	{
		cout << a[i] << ":";
	}
	cout << "\n-------" << number << "------" << endl;
}
bool can_place(int row)
{
	for (int i = 0; i < row; ++i)
	{
		if (a[row] == a[i]/*查看第a[row]列是否有皇后*/ || abs(row - i) == abs(a[row] - a[i])/*查看对角线上是否有皇后*/)
		{
			return 0;
		}
	}

	return 1;
}


下面是用非递归的方式解决N皇后问题:

#include <iostream>
using namespace std;

void Queen();
bool CanPlace(int * a, int row);//能否放置皇后
void printQueen(int * a, int n);
const int n = 8;//n个皇后
int queens[n] = { -1 };//列数初始化为-1
int sum = 0;//皇后放置方案总数
void main()
{
	Queen();

}
void Queen()
{
	int row = 0;
	while (row>=0)
	{
		++queens[row];//判断该列是否可以放置皇后
		//int m = 0;
		while (queens[row]<n && !CanPlace(queens, row))//不能放置皇后则移动到下一列,否则跳出循环
		{
			queens[row] += 1;
		}
		if (queens[row]<n)//在上述while条件中找到能放置皇后的列位置后,可以换行,对row加1
		{
			if (row==n-1)//最后一行时,输出该放置皇后方案
			{
				printQueen(queens,n);
			}
			else		//不是最后一列则换到下一行,并从第0列开始判断
			{
				++row;
				queens[row] = -1;//设置为-1是为了每行开始从0列开始查找皇后位置
			}
		}
		else   //如果该行找不到可以防止皇后位置,则退回上一行继续寻找(回溯)
		{
			--row;
		}
	}

}
bool CanPlace(int * a ,int row )//能否放置皇后
{
	for (int i = 0; i < row; ++i)
	{
		if (a[row] == a[i]/*查看第a[row]列是否有皇后*/ || abs(row - i) == abs(a[row] - a[i])/*查看对角线上是否有皇后*/)
		{
			return 0;
		}
	}

	return 1;
}

void printQueen(int * a,int n)
{
	++sum;
	for (int i = 0; i < n; ++i)
	{
		cout << a[i] << ":";
	}
	cout << "\n-------" << sum << "------" << endl;//输出方案数
}









N皇后问题 DFS C++ N皇后问题 N皇后问题研究的是如何将N个皇后放置在N * N的棋盘上,并且使皇后彼此不能相互攻击。(皇后可以直走,横走,斜走) 这里使用DFS来解决这道问题,用递归搜索所有的可能性,把符合要求的解存放在数组queenPos中,这个数组下标代表行数,对应的值代表列数。如queenPos[0]值为1,就代表皇后摆放在(0,1)这个位置。 #include&amp;amp;lt;iostream&amp;amp;gt; #i... 阅读详情

相关推荐

蓝桥杯 2n皇后问题 n皇后问题 python

蓝桥杯 2n皇后问题 n皇后问题 python资源限制问题描述输入格式输出格式样例输入样例输出样例输入样例输出实现代码算法分析N皇后问题list[:]与list[]的区别 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。 输入格式 输入的第一行为一个整

qq_48230976的博客 687

2n皇后问题 / n皇后问题

题目 点此查看原题 问题描述   给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。 输入格式   输入的第一行为一个整数n,表示棋盘的大小。   接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置...

MineQAQ 6188

【N皇后问题】递归+回溯算法求解N皇后问题

同一行上面,只能存在一个皇后。同一列上面,只能存在一个皇后。同一斜线上面,只能存在一个皇后。满足上面三个规则的一个放置方法,我们把他叫做N皇后的一个解,常见的N皇后问题有:四皇后、八皇后。对于四皇后问题,可以有下面两种摆放方法:在这里为了程序方便,我们规定:将整个棋盘看作是一个【nxn】的二维矩阵,其中矩阵中每一个单元格位置存放的元素,如果是【.】点号,则表示当前位置没有放置皇后;如果是【Q】符号,则表示当前位置放置了一个皇后。下面具体介绍一下,如何通过程序求解N皇后的问题。

✅ Java 开发工程师 1259

N皇后问题详解

原题: leetcode 51 隐式图, 状态/关系, DFS与回溯法 图的DFS的搜索过程形成搜索树, 在七月君的视频及pdf里有针对图的DFS/BFS的详细过程的讲解. 注意这个讲解是针对图(邻接表实现)的结构进行的; DFS/BFS的时间复杂度都是O(n + m); (n - 节点数量, m - 边数量); 但现实解题中图的结点和边并不是一开始就明确给出的, 需要把现实问题转换成一个"隐式图"。 隐式图, 需要根据问题去划分"状态"与"关系"。状态是指从初始到目标, 问题经历的中间过程; 状态一般是隐

葡萄老君 4287

Ubuntu18.04 SoftRoCE安装教程

目标:创建两台Ubuntu18.04虚拟机,安装SoftRoCE环境,一台作为Server,一台作为Client,模拟RDMA通信环境,熟悉RDMA的通信方式。

GGGYL111的博客 1549

别再对着数据手册画图了!用HFSS 2023 R2快速复现ESP-01的PCB天线(附模型文件)

本文详细介绍了使用HFSS 2023 R2逆向复现ESP-01 PCB天线的五个关键步骤,包括逆向工程准备、高效建模技巧、材料与边界设置、激励与求解配置以及结果分析与设计验证。通过参数化建模和智能边界检测,大幅提升仿真效率,适用于WIFI和蓝牙设备的射频设计优化。

weixin_30832143的博客 76

Java——N皇后问题

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

m0_60867520的博客 4374

算力网:正在编织的“第二电网“

中国算力网:编织智能时代的"第二电网" 中国正在构建全国一体化算力网,目标让算力资源像水电一样即取即用。这一国家战略通过"东数西算"布局,将东部算力需求与西部清洁能源优势结合,形成三级时延圈(1ms城市级、5ms区域级、20ms国家级)。算力网采用三层架构:基础设施层的八大枢纽节点作为"发电厂",编排管理层的智能调度系统作为"调度中心",运营服务层提供标准化算力服务。关键技术包括算力路由、异构算力统一度量、无损网络和液冷技术等。

这只是一个博客 668

N皇后、2N皇后问题总结

N皇后问题 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。 Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。 Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。 Sam...

lanshan1111的博客 904

利用李雅普诺夫函数开发航天器姿态控制系统

本文基于李雅普诺夫函数控制方法,采用修正罗德里格斯参数(MRP)描述航天器姿态,设计了姿态控制律。通过构造能量型李雅普诺夫函数,推导出保证系统稳定的控制闭环方程,实现了航天器从初始状态到目标状态的稳定转换。针对MRP参数可能出现的奇异性问题,采用影子集进行规避。仿真实验包含两种模式:非追踪模式(目标状态为0)和追踪模式(目标为三角函数轨迹)。结果表明,该控制方法能够有效实现姿态稳定和轨迹跟踪,在短暂调整后即可精确跟随目标轨迹。控制律设计考虑了不同参考系间的转换,通过DCM矩阵处理目标角速度的坐标变换问题。

weixin_50227659的博客 1221

税务某局 webpack 登录接口逆向分析

我们再回到接口逻辑去看一下,发现每次请求前,还有两个接口,getpublickey和sendsm4,这里分析了一下调用逻辑,sm4这个接口用到一个参数是由publickey返回的一个参数而来,这个参数又经过内部加密处理,我们找到这个参数加密的地方,大概是在这个位置。我们还是顺着逻辑将加载器扣下来,然后用一个变量去接收,有了加载器,我们直接把加密代码扣下来做下处理,把一些用到的参数整理下如下。打上断点分析后,_utils_getuuid这个很长的变量也是加载器的一个函数,我们将这段代码也扣下来,如下。

码王吴彦祖的博客 402

蓝桥杯 试题 基础练习 2n皇后问题(包含n皇后问题讲解)

思路:因为 #include<bits/stdc++.h> using namespace std; int cnt=0; int r[100]; //r[i]存放第i行所在列数 bool visit[100]; void dfs(int m,int n) { if(m==n) { cnt++; return; } for(int j=0;j<n;j++) { ...

PengWei Yang 2948

LDRA Testbed软件静态分析_常见问题及处理

通过前面的几篇文章,LDRA Testbed软件静态分析的内容基本讲解完了,本篇文章将针对使用Testbed进行软件静态分析的常见问题进行介绍。 到此为止,LDRA Testbed软件静态分析的内容已经全部讲完,如果有问题,欢迎私信提问(不经常登录,回复可能不及时,见谅)。下一篇文章将开始讲解如何使用Testbed进行单元测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 2589

N 2N皇后问题

N皇后问题: 国际象棋中皇后的势力范围覆盖其所在的行、列以及两条对角线,现在考察如下问题:如何在n x n的棋盘上放置n个皇后,使得她们彼此互不攻击 对于任何整数:n>=4,这就是n皇后问题。我们常说的8皇后问题也就是n为8的时候 //首先来看看n皇后问题 #include<bits/stdc++.h> using namespace std; int sum;//可以成功摆放...

张一 241

CGAL AlphaShape算法(自适应Alpha值,二维版本)

CGAL AlphaShape算法(自适应Alpha值,二维版本)

dayuhaitang1的博客 2324

PyTorch生成式人工智能(1)——神经网络与模型训练过程详解

在本节中,我们介绍了传统机器学习与人工神经网络间的差异,并了解了如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现了反向传播以优化权重达到最小化损失值的目标。并实现了网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 1万+
上一篇: MFC ADO链接SQL Server 2008 封装好的类
下一篇: 青蛙跳台阶(2XN骨牌问题)
fiempty
博客等级 码龄15年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值