【八皇后问题】
八皇后问题是一个以国际象棋为背景的问题：如何能够在8×8的国际象棋棋盘上放置八个皇后，使得任何一个皇后都无法直接吃掉其他的皇后？为了达到此目的，任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题：这时棋盘的大小变为n×n，而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。
== 历史 ==
八皇后问题最早是由西洋棋棋手马克斯·贝瑟尔（Max Bezzel）于1848年提出。第一个解在1850年由弗朗兹·诺克（Franz Nauck）给出。并且将其推广为更一般的n皇后摆放问题。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。
在此之后，陆续有数学家对其进行研究，其中包括高斯和康托，1874年，S.冈德尔提出了一个通过行列式来求解的方法，这个方法后来又被J.W.L.格莱舍加以改进。
1972年，艾兹格·迪杰斯特拉用这个问题为例来说明他所谓结构化编程的能力。他对深度优先搜索回溯算法有着非常详尽的描述2。
八皇后问题在1990年代初期的著名电子游戏《第七访客》和NDS平台的著名电子游戏《雷顿教授与不可思议的小镇》中都有出现。
== 解题方法 ==
八个皇后在8x8棋盘上共有4,426,165,368（64C8）种摆放方法，但只有92个可行（皇后间互不攻击）的解。如果将旋转和对称的解归为一种的话，则一共有12个独立解，具体如下：
== 解的个数 ==
下表给出了n皇后问题的解的个数包括独立解Uid=A002562以及可行解Did=A000170的个数：
可以注意到六皇后问题的解的个数比五皇后问题的解的个数要少。现在还没有已知公式可以对n计算n皇后问题的解的个数。
== 示例程序 ==
下面是求解n皇后的C代码，在程序中可以自己设置n个皇后以及选择是否打印出具体解。
#include
#define QUEENS       8 /*皇后数量*/
#define IS_OUTPUT    1 /*(IS_OUTPUT=0 or 1)，Output用于选择是否输出具体解,为1输出，为0不输出*/
int AQUEENS + 1, BQUEENS * 3 + 1, CQUEENS * 3 + 1, kQUEENS + 1QUEENS + 1;
int inc, *a = A, *b = B + QUEENS, *c = C;
void lay(int i) {
int j = 0, t, u;
while (++j
以下列出尼克劳斯·维尔特的Pascal语言程序。此程序找出了八皇后问题的一个解。
program eightqueen1(output);
var i : integer; q : boolean;
a : array 1 .. 8 of boolean;
b : array 2 .. 16 of boolean;
c : array -7 .. 7 of boolean;
x : array 1 .. 8 of integer;
procedure try( i : integer; var q : boolean);
var j : integer;
begin
j := 0;
repeat
j := j + 1;
q := false;
if a j and b i + j and c i - j then
begin
x i     := j;
a j     := false;
b i + j := false;
c i - j := false;
if i
使用回溯法进行求解八皇后问题
#include
#define PRINTF_IN 1 //定义是否打印，1：打印，0：不打印
int queens(int Queens){
int i, k, flag, not_finish=1, count=0;
//正在处理的元素下标，表示前i-1个元素已符合要求，正在处理第i个元素
int aQueens+1;    //八皇后问题的皇后所在的行列位置，从1幵始算起，所以加1
i=1;
a1=1;  //为数组的第一个元素赋初值
printf("%d皇后的可能配置是:",Queens);
while(not_finish){  //not_finish=l:处理尚未结束
while(not_finish && i1 && ai==Queens)
ai=1;  //当ai为Queens时将ai的值置1
else
if(i==1 && ai==Queens)
not_finish=0;  //当第一位的值达到Queens时结束
else
ai++;  //将ail的值取下一个值
}else if(ai == Queens)
ai=1;
else
ai++;  //将ai的值取下一个值
}else if(++i
使用回溯法进行求解八皇后问题(Java版本)，可直接复制到  N-Queens - LeetCode date=20210517181757  测试。
class Solution {
public List> solveNQueens(int n) {
List> results = new ArrayList();
// 使用 char 是为了展示结果时，直接使用 new String(char)。
// 一般情况下，使用 boolean 即可。
char result = new charnn;
for (int i = 0; i > results, char result, int x) {
for (int j = 0; j = 0 && j >= 0; --i, --j) {
if (resultij == 'Q') {
return false;
}
}
// ...
// ... ...... (x-1, y+1)
// ... (x, y)
for (int i = x - 1, j = y + 1; i >= 0 && j > results, char result) {
List list = new ArrayList(result.length);
for (char value : result) {
list.add(new String(value));
}
results.add(list);
}
}
#include "iostream"
#include "cmath"
using namespace std;
#define Max 20      //定义棋盘的最大值
int aMax;
int show(int S)    //定义出函数
{
int i,p,q;
int bMaxMax={0};     //定义且初始化b1输出模组
for(i=1;i0)
{
if(knum)     //若满足输出数组的要求就输出该数组
{
count++;
printf("%d:  ",count);
show(num);    //调用输出函数show()
}
k--;      //棋子位置不符合要求则退回前一步
ak++;   //继续寻找下一列位置
}
}
printf("总共有 %d \n",count,"个");
}
int main(void)
{
int N,d;
do
{
printf("                  N皇后问题的解(N0&&N
==大众文化==
*电脑游戏《第七访客》中，伊格（Ego，玩家）在史陶夫的府邸的游戏室里碰到的象棋问题正是八个皇后问题。pages=48-49,289-290
==延伸阅读==
* url=https://archive.org/details/acrossboardma00watk
* O.-J. Dahl, E. W. Dijkstra, C. A. R. Hoare Structured Programming, Academic Press, London, 1972 0-12-200550-3 see pp. 72–82 for Dijkstra's solution of the 8 Queens problem.
* dead-url=no
* dead-url=no
*  On The Modular N-Queen Problem in Higher Dimensions date=20140616193131 , Ricardo Gomez, Juan Jose Montellano and Ricardo Strausz (2004), Instituto de Matematicas, Area de la Investigacion Cientifica, Circuito Exterior, Ciudad Universitaria, Mexico.
* dead-url=no