n后问题(回溯法)

本文介绍了n皇后问题,即在n*n棋盘上放置n个皇后,确保它们不会互相攻击。通过回溯法,逐行放置皇后,考虑列冲突和斜线冲突。利用深度优先搜索构建解空间树,当达到n+1层时找到一个解决方案。由于回溯法的时间复杂度较高,对于大基数的皇后问题,效率较低,提到了拉斯维加斯算法作为改进方案。
摘要由CSDN通过智能技术生成

一.问题描述:

在n*n格子上放置n个皇后, 按照国际象棋规矩不可让皇后相互攻击, 即如何两个皇后不放在同一列同一行同一斜线上.

二.算法设计:

将问题转化为逐行放置皇后,即第一次放第1行,第二次放第2行,依次类推放至第n行皇后则放置完毕,如此每次放置只需考虑皇后的列冲突和斜线冲突.因为每次皇后都在新的一行放置.假设数组 x[i] 表示第i个皇后放的列数,如x[3] = 4; 表示第3个(第三行的)皇后放在第4列.

设第i行皇后放x[i]列,和第k行皇后放x[k]列,其中冲突情况有: 

  1. 列冲突, 即x[k] = x[i] 
  2. 斜线冲突,由于在n*n格子,则若有两个棋子属于同一斜线,则两棋子斜率为-1,可推出 | x[i]-x[k] | /| (i-k) |=1; 则 |i-k|= | (x[i]-x[k]) |
因此在此可以先定义检验函数bool Place(int k),该函数检验第k行皇后与之前的所有皇后有没有冲突,

函数代码如下:

bool Queen::Place(int k)
{
	for(int j=1;j<k;j++)
		if(  ( abs(k-j)==abs(x[j]-x[k]) ) ||(x[j]==x[k])  )//斜线冲突和列冲突
			return false;			//返回false
	return true;	//注意这里不是else执行返回true,当k与之前所有皇后冲突检测通过后</span>才返回true
}


三.解空间:

n后问题的解可以用一颗解空间树表示,其中从根节点开始对树进行深度优先搜索,


从第一个根节点开始搜索,如果找到第n+1层,则所有n后放置完毕,解决方案sum+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值