问题描述
n皇后问题是指在一个n*n的国际象棋棋盘上放置n个皇后,使得这n个皇后两两均不在同一行、同一列、同一条对角线上。
求合法的方案数。
解法一
#include<iostream>
#include<cmath>
using namespace std;
//int count=0;
int nQueen(int a[],int k,int n)
{
static int count=0;
if(k==n-1)
{
bool flag=true;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(abs(i-j)==abs(a[i]-a[j])) flag=false;
}
}
if(flag) count++;
//count++;
}
else
{
for(int i=k;i<n;i++)
{
swap(a[i],a[k]);
nQueen(a,k+1,n);
swap(a[i],a[k]);
}
}
return count;
}
int main()
{
int a[8]={1,2,3,4,5,6,7,8};
cout<<nQueen(a,0,8);
//cout<<count;
return 0;
}
解法二
蛮力法( 算法笔记 P116)
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=12;
int P[maxn];
bool hash[maxn]={false};
int count=0;
int n;
void generate(int index)
{
if(index==n+1)
{
bool judge=true;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(abs(i-j)==abs(P[i]-P[j]))
{
judge=false;
break;
}
}
}
if(judge) count++;
//return;
}
else
{
for(int i=1;i<=n;i++)
{
if(hash[i]==false)
{
P[index]=i; //填入数据
hash[i]=true;
generate(index+1);
hash[i]=false;
}
}
}
}
int main()
{
n=8;
generate(1);
cout<<count;
return 0;
}
解法三
回溯法(算法笔记 P117)
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=12;
int P[maxn];
bool judge[maxn]={false};
int count=0;
int n;
void generate(int index)
{
if(index==n+1)
{
count++;
}
else
{
for(int i=1;i<=n;i++)
{
if(judge[i]==false)
{
bool flag=true;
for(int j=1;j<index;j++)
{
if(abs(j-index)==abs(i-P[j]))
{
flag=false;
break;
}
}
if(flag)
{
judge[i]=true;
P[index]=i; //别忘记填入数据
generate(index+1);
judge[i]=false;
}
}
}
}
}
int main()
{
n=8;
generate(1);
cout<<count;
return 0;
}