/*
递归回溯方法解决
n皇后问题
*/
#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);
}
}
递归回溯方法解决
n皇后问题
*/
#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