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;
//