暴力求解
#include <stdio.h>
#include <math.h>
int place(int *arr,int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if( arr[i]==arr[j] || abs(i-j)==abs(arr[i]-arr[j]) )
return 0;
return 1;
}
int main()
{
int i,j,k,flag=0;
int n,count=0;
int *arr;
printf("Input n:");
scanf("%d",&n);
arr=new int[n];
for(k=0;k<pow(n,n);k++){
j=k;
for(i=0;i<n;i++){
arr[i]=j%n;
j=j/n;
}
flag=place(arr,n);
if(flag==1)
count++;
}
printf("The count:%d\n",count);
return 0;
}
回溯求解
//在n*n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之
//处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,
//任何2个皇后不放在同一行或同一列或同一斜线上。
//回溯法
#include <stdio.h>
#include <math.h>
int *x; //一维数组存储每行的皇后对应列的位置
int n;
int sum;
//判断是否在同一列或同一斜线上
int place(int k)
{
int i;
for(i=0;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++; //到达最后一层,即t==n
else
{
for(i=0;i<n;i++){
x[t]=i;
if(place(t)) //回溯之前判断之前是否place对,提高效率
backtrack(t+1);
}
}
}
int main()
{
int i;
printf("input the number of queens:");
scanf("%d",&n);
x=new int [n];
for(i=0;i<n+1;i++)
x[i]=0;
sum=0;
backtrack(0);
printf("%d\n",sum);
return 0;
}