P1562 还是N皇后

该博客讨论了P1562题目,涉及深度优先搜索(DFS)、剪枝和位运算技术。作者指出,尽管题目难度标记为3,但实际解题过程中需要使用状态压缩(状压搜索)方法,通过函数参数传递每行的可选状态,并利用位运算更新对角线上的状态。在递归过程中动态判断不可放置的点,但这种方法的时间效率相对较低,仍有优化空间。
摘要由CSDN通过智能技术生成

知识点:深搜,剪枝,位运算

难度:3

感觉这个题还是比别的难度为3的题要难一些,因为用到了状压搜索,我这里使用的写法是把每一行的状态当成了函数参数的写法,也就是函数里面有三个参数表示状态,每个数表示当前行的每一列当前情况下是不是可选的点,第一个是竖直,第二个是右上到左下的对角线,第三个是左上到右下的对角线,然后我们向下一层递归的时候要计算出新的参数,两个对角线分别需要用到移位运算,然后高位低位分别补1,

我这个时间效率还不是很高,1.8s,我看洛谷其它的提交基本上都是1s左右,甚至还有500ms的,说明我这个还有将近一倍的优化空间,而且我这个不能放置的点是在递归函数里面判断的,不是一开始就预处理好的

#include <bits/stdc++.h>

using namespace std;

const int N = 14;

int n, ans, h[1 << N];
string s[N];

int lowbit(int x) {
	return x & -x;
}

void dfs(int k, int col, int dia1, int dia2) {
	if (k == n) {
		ans++;
		return;
	}
	int num = col & dia1 & dia2;
	for (int i = num; i; i -= lowbit(i)) {
		int t = lowbit(i);
		if (s[k][h[t]] == '.') continue;
		col -= t;
		int t1 = dia1, t2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值