问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
设i从0-n-1控制每一行只有一个皇后,数组a[i]的值表示皇后所处的列数,
把n*n的棋盘转化成n进制,n个皇后的位置一共有n^n种可能,
任意相邻的两个皇后在同一行或同一列:a[i]==a[j];
任意相邻的两个皇后在同一斜线上:|i-j|==|a[i]-a[j]|;
#include<stdio.h>
#include<math.h>
#define n 8
int place(int a[n])
{
int i,j;
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]))
return 0;
return 1;
}
int main()
{
int a[n];
int count=0;
int i,j;
int num,temp;
for(num=0;num<pow(n,n);num++)
{
temp=num;
for(i=0;i<n;i++)
{
a[i]=temp%8;
temp/=8;
}
if(place(a))
{
count++;
}
}
printf("%d\n",count);
return 0;
}