问题描述:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
解题思路:
- 搜索空间是子集树。
- 整个棋盘的第一列肯定都存在可能的,所以需要循环遍历。
- 逐个判断位置是否合法。
- 到达叶子结点后,方案加1。
#include<bits/stdc++.h>
#define NUM 20
using namespace std;
int n;
int x[NUM];
int sum;
inline bool Place(int t)
{
int i;
for (i=1; i<t; i++)
{
if ((abs(t-i) == abs(x[i]-x[t])) || (x[i] == x[t]))
return false;
}
return true;
}
void Backtrack(int t)
{
int i;
if(t>n)
{
sum++;
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
}
else
for(i=1;i<=n;i++)
{
x[t]=i;
if(Place(t))
Backtrack(t+1);
}
}
int main()
{
cin>>n;
Backtrack(1);
cout<<sum;
}