N皇后问题(N queen‘s problem)

N皇后问题是一个经典的回溯算法应用,目标是在N×N棋盘上放置N个皇后,要求同一行、列及对角线上没有皇后冲突。解决思路包括逐列扫描,检查当前位置是否安全,若无法放置则回溯至上一列重新尝试,直到找到所有可行解。给出的代码示例展示了4×4棋盘的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

N 皇后问题是一个古老而著名的问题, 是回溯算法(back track)的典型案例。问题描述如下:

N x N 的棋盘上放置N个皇后。 要求同一行中, 同一列中, 以及对角线上(包括正负对角线)只能有一个皇后, 否则就会发生clash的情况而失败。 问解决方案?

解决思路如下:

(1)逐列扫描, 从最左边的列开始, 总共有N个queens。

(2)如果所有的queens 都被安全放置了, 就返回true。

(3)对于给定的列, 尝试所有的行, 此时行是变量, 注意此时此列的左边的所有的列都放置了皇后, 此时我们只需要对当前列的所有行进行扫描, 寻找放置的可行的行,所谓可行就是不会与左边的皇后产生clash, 条件为三个方向, 不同列(当然会满足), 不同行, 不同上斜对角线, 不同下斜对角线。 

(4) 一旦放置好当前的列一个的皇后, 就进入下一列放置。 但是一旦没有产生可行解的时候, 就要回溯(backtrack)到上一列, 重新放置上一列的皇后, 继续重复上述步骤, 直至成功, 否则输出失败。

参考程序如下(4 * 4)参考至geeks for geeks:

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 4;

// 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值