N皇后问题 输入一个正整数N,则程序输出N皇后问题的全部摆法。 输出结果里的每一行都代表一种摆法。行里的第i个数字如 果是n,就代表第i行的皇后应该放在第n列。 皇后的行、列编号都是从1开始算。 样例输入: 4
样例输出: 2 4 1 3
3 1 4 2
/*
n皇后问题
利用递归解决N重循环问题
*/
#include<iostream>
#include<cmath>
using namespace std;
int N;
int queuePos[100]; //存放皇后的列位置
void NQueue(int k); //表示第k-1个皇后位置已经摆好,进行第k个皇后的摆放
int main()
{
cin >> N;
NQueue(0);//从第0行开始摆放皇后
return 0;
}
//表示第k-1个皇后位置已经摆好,进行第k个皇后的摆放
void NQueue(int k)
{
//如果k为N说明第N个位置摆放完毕,结束递归,输出结果,注意位置从0开始,+1
if(k == N)
{
for(int i = 0;i < N;i++)
{
cout << queuePos[i] + 1<<" ";
}
cout << endl;
return;
}
//逐个尝试第k行每一种可能摆放
for(int i = 0;i < N;++i)
{
int j;
//让该位置与前k-1的皇后位置相比较,有冲突则退出循环,无冲突则记录下位置
for(j = 0;j < k;++j)
{
if(queuePos[j] == i || abs(queuePos[j] - i) == abs(k - j))
break;
}
//k == j代表无冲突,此时记录下位置并开始k+1行皇后的递归调用
if(k == j)
{
queuePos[k] = i;
NQueue(k+1);
}
}
}