问题描述
在n*n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
//暴力
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define n 8//指定了8个皇后可以修改
int a[n];
int ok()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
if(a[i]==a[j]||abs(j-i)==abs(a[j]-a[i]))
return 0;
}
return 1;
}
int main()
{
int sum=0;
int temp;
int i,j;
for(i=0;i<pow(n,n);i++)
{
temp=i;
for(j=0;j<n;j++)
{
a[j]=temp%n;
temp/=n;
}
if(ok())
{
sum++;
}
}
printf("\n%d",sum);
return 0;
}
//回溯
#include<stdio.h>
#include<stdlib.h>
#define n 8
int a[n];
int sum=0;
int ok(int k)
{
for(int i=0;i<k;i++)
if(a[k]==a[i]||abs(i-k)==abs(a[i]-a[k]))
return 0;
return 1;
}
void back(int h)
{
int i,j;
if(h>=n)
{
sum++;
}
for(i=0;i<n;i++)
{
a[h]=i;
if(ok(h))
back(h+1);
}
}
int main()
{
back(0);
printf("\n the number of the method is %d\n",sum);
return 0;
}