通过C语言,利用递归回溯的方法,实现八皇后问题的求解

八皇后问题:
在国际象棋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);//调用求解函数,负责打印结果
}

原文地址:https://www.cnblogs.com/ZhongShengXueXi/p/9129501.html