八皇后问题:
在国际象棋8*8的棋盘上,摆放八个皇后且皇后都无法吃掉对方,而八皇后的攻击路线
为它所在的列和行,还有45度斜线.
对于该问题,首先要确定递归的输入和输出,以及终止条件和方法。一个递归完成对当
前行皇后位置的确定,并通过遍历所有列,查找出所有可能。其中,利用对列的遍历实
现回溯。
具体实现方法,可以通过代码理解,以及思路参考https://blog.csdn.net/a304672343/article/details/8029122
参考博客的博主对于八皇后位置的表示处理的很好,非常有借鉴意义
//[数据结构]:八皇后=
//[递归],[回溯]
include <stdio.h>
include <stdbool.h>
include <stdlib.h>
define n 8 //确定八皇后的阶数
int queen[n]; //每行对应的皇后位置 queen[行数row] = 列数col
int num = 0; //计算可能出现的正确方式次数
//判断当前行,皇后位置是否合理
bool isqueen(int row)
{
for(int i=0;i<row;i++)//依次将当前行皇后位置与已放行皇后位置进行比较
{
if(abs(row-i) == abs(queen[row]-queen[i]) || queen[row] == queen[i])
//此处用意:确定当前行皇后位置是否与已放行皇后位置存在冲突(对角线 || 同一列)
{
return false;
}
}
return true;
}
//求解函数
void eightqueen(int row)
{
for(int col=0;col<n;col++) //依次摆放的列,遍历,回溯
{
queen[row] = col; //
if(isqueen(row)) //
{
if(row == n-1) //最后一列,递归终止条件
{
num++; //可能情况
printf("第%d种:",num);
for(int i=0;i<n;i++) printf("(%d,%d) ",i,queen[i]);
printf("
");
}
else eightqueen(row + 1); //下一行
}
}
}
int main()
{
printf("welcome to eightqueen's question
表示方法:(行数,当前行皇后所在列数)
");
eightqueen(0);//调用求解函数,负责打印结果
}