在n*n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
参考代码如下:
1、回溯法
#include <stdio.h>
#include <math.h>
int *x;
int n;
int sum;
int place(int k)
{
int i;
for(i=1;i<k;i++)
if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k]))
return false;
return true;
}
void backtrack(int t)
{
int i;
if(t>n) sum++;
else
{
for(i=1;i<=n;i++){
x[t]=i;
if(place(t))
backtrack(t+1);
}
}
}
int main()
{
int i;
printf("input the number of queens:");
scanf("%d",&n);
x=new int [n+1];
for(i=0;i<n+1;i++)
x[i]=0;
sum=0;
backtrack(1);
printf("%d\n",sum);
return 0;
}
2、暴力求解
#include <stdio.h>
#include <math.h>
int main()
{
int num,n;
int count=0;
int i,j,k;
int *a;
printf("input the number:");
scanf("%d",&n);
a=new int[n];
for(num=0;num<pow(n,n);num++){
j=num;
for(i=0;i<n;i++){
a[i]=j%n;
j=j/n;
}
k=1;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[i]==a[j] || abs(i-j)==abs(a[i]-a[j])){
k=0;
break;
}
}
}
if(k==1)
count++;
}
printf("the result is %d.\n",count);
return 0;
}