#include"stdio.h"
#include "math.h"
int manage(int);
int a[100];
int main()
{
int i,j,k;
int temp;
int n;
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=0;
for(i=0;i<pow(n,n);i++)
{
temp=i;
for(j=0;temp>0;j++)
{
a[j]=temp%n;
temp=temp/n;
}
if(manage(n)==1)
{
for(k=0;k<n;k++)
printf("%d ",a[k]);
putchar ('\n');
}
}
return 0;
}
int manage(int n)
{
int i,j;
int flag=1;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
flag=0;
return 0;
}
}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if((a[j]-j==a[i]-i) || (a[j]+j==a[i]+i))
{
flag=0;
return 0;
}
}
return 1;
}
<pre name="code" class="cpp">//用回溯法进行解答,并输出解的个数和所需时间
#include "stdio.h"
#include "malloc.h"
#include "time.h"
int count=0;
int manage(int a[],int t)
{
int i;
for(i=0;i<t-1;i++)
{
if(a[i]==a[t-1] || (a[i]-i==a[t-1]-t+1) || (a[i]+i==a[t-1]+t-1))
return 0;
}
return 1;
}
int backtrack(int a[],int cut[],int t,int n)
{
int i,j;
if(t==n)
for(i=0;i<n;i++)
{
a[t-1]=i;
if(manage(a,t)==1)
{
count++;
}
a[t-1]=0;
}
else
for(i=0;i<n;i++)
{
a[t-1]=i;
if(manage(a,t)==1)
backtrack(a,cut,t+1,n);
a[t-1]=0;
}
return 0;
}
int main ()
{
int i,n,t=1;
int *a,*cut;
int Time1,Time2;
Time1=time(0);
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int));
cut=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
a[i]=0;
backtrack(a,cut,t,n);
printf("%d\n",count);
Time2=time(0);
printf("所需时间为%ds",Time2-Time1);
return 0;
}