N皇问题(dfs)

该博客探讨了如何使用深度优先搜索(DFS)解决经典的N皇后问题,即在N×N的棋盘上放置N个皇后,使得它们互不攻击。文章提供了样例输入和输出,并详细解释了通过位数组来简化状态记录的方法,以及如何处理行、主对角线和副对角线上的皇后。还特别强调了判断失败、回溯和输出后状态还原的重要性,并附带了C++代码实现。
摘要由CSDN通过智能技术生成

题目描述
在一个NN的国际棋盘上,放置N个皇后,使她们相互之间不能进攻(任意两皇后不能位置同一行、同一列、同一斜线)。
因为每行只有一个皇后,我们可以用一行N个数值来表示N
N棋盘上皇后位置。
结果中第i列的数值j表示棋盘上第[i,j]位置上有一个皇后。
2 4 6 1 3 5
表示棋盘上第[1,2]、[2,4]、[3,6]、[4,1]、[5,3]、[6,5]位置上有一个皇后。

输入
N(6≤N≤13)

输出
前三行为先得到的三组解,
每组解为N个数,之间用空格隔开。
最后一行为总解数

样例输入
6

样例输出
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

分析
为了减少复杂度,用一位数组代替二维数组,a[i] = j代替a[i][j];
b[15]用来记录行有没有棋子,假如b[1] == 0,则表示第一行没有棋子,放入棋子后(a[ ] = 1)就使b[1] = 1;
c[30]用来记录主对角线上是否有棋子;
d[30]用来记录副对角线上是否有棋子;

注意
记得还原,比如判断失败

if(b[a[step]] == 0)
	 	b[a[step]] = 1;
	  	else
	  	{
   
			c[p] = 0;
			d[q] = 0;
			continue;
		}

和回溯,特别是输出之后

if(step == n)
	  	{
   
	  		if(num < 3)
	   		show();
	   		num++;
			c[p] = 0;
			d[q] = 0;
			b[a[step]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值