码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-06-03 17:39:20      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:调用   ==   结构   i++   意义   clu   tps   象棋   tail   

八皇后问题:
在国际象棋8*8的棋盘上,摆放八个皇后且皇后都无法吃掉对方,而八皇后的攻击路线
为它所在的列和行,还有45度斜线.

对于该问题,首先要确定递归的输入和输出,以及终止条件和方法。一个递归完成对当
前行皇后位置的确定,并通过遍历所有列,查找出所有可能。其中,利用对列的遍历实
现回溯。

具体实现方法,可以通过代码理解,以及思路参考https://blog.csdn.net/a304672343/article/details/8029122
参考博客的博主对于八皇后位置的表示处理的很好,非常有借鉴意义

//==========[数据结构]:八皇后===========
//[递归],[回溯]

include

include

include

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("\n");
}
else eightqueen(row + 1); //下一行
}
}
}

int main()
{
printf("====welcome to eightqueen‘s question====\n表示方法:(行数,当前行皇后所在列数)\n");
eightqueen(0);//调用求解函数,负责打印结果
}

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

标签:调用   ==   结构   i++   意义   clu   tps   象棋   tail   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!