1.递归回溯法
#include <stdio.h>
#include <math.h>
#define N 15
int x[N]; //皇后放置的列数
int n; //皇后个数
int sum=0; //可行解个数
int place(int k)
{
int i;
for(i=1;i<k;i++)
if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i])
return 0;
return 1;
}
int queen(int k)
{
int i;
if(k>n)
sum++;
else
for(i=1;i<=n;i++)
{
x[k]=i;
if(place(k))
queen(k+1);
}
return sum;
}
int main()
{
printf("Please input n:(n<15)");
scanf("%d",&n);
printf("%d\n",queen(1));
return 0;
}
2.迭代回溯法
#include <stdio.h>
#include <math.h>
#define N 15
int n;
int sum=0;
int x[N];
int place(int k)
{
int i;
for(i=1;i<k;i++)
if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i])
return 0;
return 1;
}
int queen()
{
int t=1;
x[1]=0;
while(t>0)
{
x[t]++;
while(x[t]<=n&&!place(t))
x[t]++;
if(x[t]<=n)
{
if(t==n)
sum++;
else
x[++t]=0;
}
else
t--;
}
return sum;
}
int main()
{
printf("Please input n:(n<15)");
scanf("%d",&n);
printf("%d\n",queen());
return 0;
}