八皇后算法描述如下:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法!
#include<stdio.h>
#include<math.h>
int r[9], m[9], count = 0;
int p(int i);
int main()
{
printf("%d", p(1));
return 0;
}
int p(int i)
{
int j, k, x, y;
if(i==9)//边界
{
count++;
for(x = 1;x<=8;x++)
{
printf("%d", r[x]);
}
if(x==9)
{
printf("\n");
}
}else{
for(j = 1;j<=8;j++)//i列每一行检索
{
if(m[j]==false)//j行未占用
{
bool flag = true;
for(k = 1;k<i;k++)
{
if(fabs(i-k)==fabs(r[k]-j))//与之前的点横纵只差不相等即不在同一斜线
{
flag = false;
break;
}
}
if(flag==true)//如果与之前放置的皇后不冲突
{
r[i] = j;
m[j] = true;
p(i+1);//下一列
m[j] = false;
}
}
}
}
return count;
}