#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
void queen(int row , int* c); //遞歸回溯本體
int is_true(int row , int* c); //判斷是否目前旗子擺放符合條件
int n , total = 0;
int main()
{
cin>>n;
int c[n]; //初始化數組
//因為每一行隻能有一個旗子,是以用一維數組儲存列資訊
queen(0,c);
cout<<total;
return 0;
}
int is_true(int row , int* c)
{
for(int i = 0 ; i < row ; i++)
{
if(c[i]==c[row]||i-c[i]==row-c[row]||i+c[i]==row+c[row]) //若在同一條對角線上則數組中旗子的角标元素在x+y或x-y的直線上
return 0;
}
return 1;
}
void queen(int row , int* c)
{
if(row==n)
total++;
else
{
for(int col = 0 ; col < n ; col++) //從第一列周遊到最後一列
{
c[row] = col;
if(is_true(row , c))
queen(row+1,c);
}
}
}
參考:https://www.cnblogs.com/bigmoyan/p/4521683.html