在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
有个朋友前些天推荐了这道题(觉得好有意思)
看到@哆啦A梦有时光机的博客(分配宝藏)(原谅我不会转载)(呜呜呜)
顿悟了。
思路(有备忘录的递归)
:创立一个数组用于存放列数(行数直接确定)(按行数放列数)
(1-8表示位置,满足条件后判断八皇后问题)
#include<stdio.h>
int count=0,space;
int b[9]={0};
void huang(int num,int space)
{
int k=space,i,j;
b[k]=num;
int flag1=0,flag2=0;
if(k==8)
{for(i=1;i<=7;i++)
{
for(j=1;i+j<=8;j++)
{
if(b[i]==b[i+j])
{
flag1=1;
break;
}
}
if(flag1==1)break;
}
for(i=1;i<=7;i++)
{
for(j=1;i+j<=8;j++)
{
if(b[i]+j==b[i+j]||b[i]-j==b[i+j])
{
flag2=1;
break;
}
}
if(flag2==1)break;
}
if(flag1==0&&flag2==0)count++;
return ;
}
else
for(i=1;i<=8;i++)huang(i,space+1);
}
int main()
{
huang(0,0);
printf("%d",count);
return 0;
}