/*
时间:2011-11-21
作者:xiaosi
题目:n皇后问题
*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define M 100
class Queen
{
friend void nQueen();
private:
void Backtrack(int t);
bool Place(int k);
int n;//皇后个数
int count;//方案数
int x[M];//可行解
};
bool Queen::Place(int k)
{
for(int j=1;j<k;j++)
{
if((abs((double)(k-j))==abs((double)(x[j]-x[k]))||(x[j]==x[k])))
{
return false;
}
}
return true;
}
void Queen::Backtrack(int t)
{
int j;
if(t>n)
{
count++;
}
else
{
for(j=1;j<=n;j++)
{
x[t]=j;
if(Place(t))
{
Backtrack(t+1);
}
}
}
}
void nQueen()
{
int i,j;
Queen X;
X.count =0;
scanf("%d",&X.n);
for(i=1;i<=X.n;i++)
{
X.x[i]=0;
}
X.Backtrack(1);
printf("%d",X.count);
}
int main()
{
nQueen();
return 0;
}
回溯法之n皇后问题
最新推荐文章于 2023-08-31 16:04:31 发布