皇后的攻击性:不能同一行同一列或同一对角线。
用一个一维数组a[i]表示皇后i放在棋盘的第i行的第a[i]列。
#include <stdio.h>
#include <math.h>
void search(int);
void printresult();
int canplace(int,int); //判断该位置能否放置皇后
int a[8],sum=0; //每找到一组解,sum加一
int main()
{
search(0);
printf("%d",sum);
}
void search(int m)
{
int i;
if(m>=8) //此时算法已经搜索到叶节点,即已经找到一组解
printresult(),sum++;
else
{
for(i=0;i<8;i++)
{
if(canplace(m,i))
{
a[m]=i;
search(m+1); //递归搜索下一层
}
}
}
}
int canplace(int row, int col)
{
int i;
for(i=0;i<row;i++)
if(abs(i-row)==abs(a[i]-col)||a[i]==col) return 0;
return 1;
}
void printresult()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if(a[i]==j)
printf(" A ");
else
printf(" . ");
printf("\n");
}
printf("\n");
}