八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
#include<iostream>
using namespace std;
int Queenarr[101];//這個數組是爲了存放皇后的位置,索引爲行號,
int n;
void NQueen(int k)
{
if (k==n)
{
for (int i = 0; i < n; i++)
{
cout << Queenarr[i]+1<< " ";//+1 是因爲行號是從0開始的
}
cout << endl;
return;
}
for (int i = 0; i < n; i++)//先將第一個皇后放在(0,0)的位置,這個結束並且輸出後,將其放在(0,1),依次往後
{
int j;
for ( j = 0; j < k; j++)//將第K行與前K-1行的所有皇后進行列號對比,並且看是否在同一斜線上
{
if (Queenarr[j]==i||abs(Queenarr[j]-i)==abs(k-j))//如果滿足其中條件之一
{
break;//跳出循環,將皇后放在i+1上繼續重複上面步驟,看是否符合;
}
}
if (j==k)//如果跳出循環,這個不會成立
{
Queenarr[k] = i;
NQueen(k + 1);//進行第 K+1個皇后
}
}
}
int main()
{
cin >> n;//n皇后
NQueen(0);
return 0;
}