c语言代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void show(); /*打印矩阵*/
int check(int queen_id); /*判断该位置是否能够放置皇后*/
void eight_queen(int n); /*摆放*/
int queens[8]; /*定义一个长度为8的数组,代表八个皇后所在行的第几列,8代表八行*/
int sum=0; /*记录摆法总数*/
int max=8; /*限制摆放八个皇后*/
int main(void)
{
/*开始摆放皇后,从0,也就是第一个皇后开始摆放,0代表第一个皇后对应数组下标,方便用定义的数组来描述皇后的位置*/
eight_queen(0);
printf("\n共%d种方法!", sum);
return 0;
}
void show()
{
printf("\n\nThis is solution no.%d!\n", sum);
for(int i=0;i<max;i++)
{
for(int j=0;j<max;j++)
{
/*判断该位置是否与皇后所在位置相同*/
if(queens[i]== j)
printf("M");
else
printf("-");
}
printf("\n");
}
}
int check(int queen_id)
{
for(int i=0;i<queen_id;i++)
{
/*待摆放的皇后不能与已摆放的皇后同列或者在同一对角线上*/
/*同一对角线的两个皇后它们的行数相减的绝对值等于列数相减的绝对值*/
if(queens[i] == queens[queen_id] || abs(queens[queen_id] - queens[i]) == (queen_id - i))
return 0;
}
return 1;
}
void eight_queen(int n)
{
if(n<max)
{
/*每次从第n+1行的第一列开始摆放*/
for(int j=0;j<max;j++)
{
queens[n] = j;
if(check(n))
/*如果第n个皇后可以摆放则摆放第n+1个皇后*/
/*因为待摆放皇后不能跟前一个同行,所以默认是从下一行的第一列开始摆放*/
eight_queen(n+1);
}
}
else
{
/*摆完八个皇后,摆法总数加 1 */
sum++;
show();
}
}
最后执行结果:
总结:就是每次放皇后时从每行的第一列开始放置,满足条件则开始放置下一个皇后;如果不满足条件,则放第二列,继续判断是否符合条件,倘若该行都不能放置,返回上一行,移动该行的皇后到下一列,判断是否符合条件,符合则开始下一行皇后,不符合则又放置该行下一列。如此反复!
————————————————————
——————————
—————
——