N皇后问题
解释在代码里已经写的很清楚了,就不赘述了
#include <iostream>
#include <math.h>
using namespace std;
int N;//皇后的个数
int qpostion[100];//存储皇后的位置,第i行的皇后在第j列,这个j就存在qpostion[i]里,i是数组的索引
void Nqueen(int k);
int m = 0;//记录方案次数
int main() {
while (true)
{
cin >> N;
Nqueen(0);
cout << m << endl;
m = 0;
}
}
void Nqueen(int k)//这个函数假定0到k-1行的皇后都已经摆好了,现在要摆放第k个皇后
{
int i;
if (k==N)//如果k=给定的皇后数,则意味着棋盘已经摆好了(k从0开始)
{
for (i=0;i<N;i++)//输出皇后的位置
{
cout << qpostion[i]+1 << " ";
}
cout << endl;
m++;//方案数+1
return;
}
for (i=0;i<N;i++)
{//尝试当前行的所有位置
int j;
for (j=0;j<k;j++)
{//用当前的位置和已经摆好的k个皇后比较,如果列数相同,又或者是在对角线上,那么跳出,
if (qpostion[j]==i||abs(qpostion[j] - i)==abs(j-k))
{
break;
}
}
if (j==k)//如果没有跳出,那么j必定和k相等
{
qpostion[k] = i;//更新第k行也就是第k+1个皇后的位置
Nqueen(k + 1);//接着摆放第k+1行;
}
}
}