[内附完整源码和文档] 基于C++求解2N皇后问题

本文详细介绍了如何使用C++解决2N皇后问题,包括算法思想、空间和时间复杂度分析,以及实验结果。对于偶数N,通过求得一组解并进行对称变换得到另一组解;奇数N时,需避免皇后对称放置。采用爬山算法和CSP策略,通过一维数组降低空间开销,随机重启寻找全局最优解。

一、算法思想
首先分析一下 2N 皇后问题中的 N:

当 N 为偶数时:其实只要求得一组可行解即可,另外一组可行解可以由当前解沿N*N 矩阵的中轴线作对称变换得到。因为 N 为偶数,所以不会存在黑白皇后位置冲突的情况。

例如:N=4 时,求得一组可行解为:3 1 4 2,按着这个思路,变换得到另一组可行解为:2 4 1 3。可以判断,这样的两组解合并起来是符合题目要求的。

当 N 为奇数时:沿中轴线对称的方式不再可行,因为肯定有一个皇后会落在中轴 线上。此时,可以考虑通过中心点作点对称的情况。

这里要注意,如果求得的可行解存在关于中心点对称的皇后摆放(或有皇后位于中心点),那么此解不合要求,需要重新再求;直到没有两个皇后的位置是关于中心点对称,另 一组解可以通过对当前解关于中心点作点对称变换得到。

例如,N=5 时,求得一组可行解为:2 4 1 3 5,按着这个思路,变换得到另一组可行解 为:1 3 5 2 4。可以判断,这样的两组解合并起来是符合题目要求的。

从上可以看出,其实 2N 皇后问题在大多数情况下并不需要二次求解 N 皇后,只需求 得一组可行解即可。

那么,接下来的事情就好办多了。只需要利用目标算法求得 N 皇后问题一个符合要求的解即可。

爬山算法属于局部搜索算法的一份子,因此是一种解决最优化问题的启发式算法。在实际运用中,爬山算法不会前瞻与当前状态不直接相邻的状态,只会选择比当前状态价值更好的相邻状态,所以简单来说,爬山算法就是向价值增长方向持续移动的循环过程。初始状态下,每行每列都是一个皇后,之后的求解就是对存在冲突的列,寻找其他的冲突列来进行交换。因为寻找是随机的,所以每次程序的运行结果可能也存在一定的偶然误差。求解过程中,当得到了局部极大值时,如果不是全局最优解(即冲突数为 0),则随机生成初始状态,重新求解,直到得到全局最优解。

CSP 算法的实现与爬山算法有不少的相同部分。比如初始值的生成,同样,也都是 采用交换列的方式来实现消解冲突的。求解时,遍历每一个皇后,选择当前行的皇后与其他皇后冲突最少的列(相同则随机选),交换当前行与目标行皇后。若遍历完后没求得解,则再遍历,直到求得解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值