N皇后II C++ 集合 位运算

博客介绍了N皇后II问题的解决方案,重点讲解了利用C++的位运算来优化解法。通过位运算,可以高效地判断棋盘上某位置是否可以放置皇后,以及更新已放置皇后的状态。文章详细解释了位运算在解法二中的应用,包括如何表示和更新列、斜线上的皇后位置。
摘要由CSDN通过智能技术生成

N皇后II

leetcode 52.N皇后II

1.解法一

判断一个位置是否有效主要依据以下四点,第一点其实可以不用判断

  • 每一行上,皇后是否出现一次以上
  • 每一列上,皇后是否出现一次以上
  • 每一斜对角线(从左上到右下),****
  • 每一斜对角线(从右上到左下),****

因此,可用四个数组,存储以上四种情况,N个皇后

  • vectorr(n,false)
  • vectorc(n,false)
  • vectorld(2 * n + 1,false)
  • vectorrd(2 * n + 1,false)

而ld有如下性质:在同一斜线上的点,行号列号之差的绝对值相等,例如下面的X,可以加上N-1来补偿,这样使 [0,3] 所在的斜线为第一条,依次往上直到第七条。所以判断某一斜线上是否有点为 ld[row - col + n - 1] == false

  	0	1	2	3
  0	O	O	O	O	
  1	X	O	O	O
  2	O	X	O	O
  3	O	O	X	O

rd有如下性质:同一斜线上的点,行号与列号之和相等,判断某一斜线上是否有点的条件是 rd[row + col] == false

  		0	1	2	3
  	0	O	O	X	O	
  	1	O	X	O	O
  	2	X	O	O	O
  	3	O	O	O	O

由此,行号为参数,for循环每次都从某一行的第一列开始检查合法位置,如果某一列有效,对下一行进行递归。

代码如下:

class Solution {
   
public:
	int totalNQueens(int n){
   
		vcol.resize(n, true);
		rd.resize(n + n - 1, true);
		ld.resize(n + n - 1, true);
		vector<string>tmp(n, string(n, '.'));
		back_track(tmp, n, 0)<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值