《C编程技巧:117个问题解决方案示例 》 —3.8 解决八皇后问题

举报
华章计算机 发表于 2020/02/12 15:27:32 2020/02/12
【摘要】 本节书摘来自华章计算机《C编程技巧:117个问题解决方案示例 》 一书中第3章,第3.8节,作者是希里什·查万(Shirish Chavan),卢涛 译。

3.8 解决八皇后问题

问题

你想利用回溯法来解决八皇后问题。

解决方案

回溯法是一种通用算法,用于查找计算问题的一些或所有可能的解决方案。在回溯中,首先考虑所有可能的候选者(可能成功),然后丢弃无法成功的候选者。最后,只剩下那些成功解决问题的候选人。在国际象棋棋盘上,八个皇后的排列方式使得没有皇后可以攻击另一个皇后。一个成功的解决方案要求没有两个皇后在相同的行、列或对角线上。编写一个C程序,依照以下规格说明使用递归来解决八皇后问题:

定义名为queen()的函数。两个int值将作为输入参数传递给此函数:棋盘上的行号和棋盘上的皇后数(在本例中为8)。

函数queen()以递归方式调用函数print()、函数place()以及函数queen()本身。

函数place()检查将皇后放置在棋盘上方格的可能性。如果一切正常,则返回1,否则,它返回0。

函数print()在屏幕上显示皇后的成功位置。

以下是使用这些规格说明编写的C程序的代码。在文本编辑器中键入以下C程序,并将其保存在文件夹C:\Code中,文件名为queens.c:

 image.png

image.png

 

 

编译并执行此程序。请注意,这个问题有92种成功的解决方案。执行开始时,屏幕上会显示解决方案1,如此处所示。按Enter键,然后屏幕上显示解决方案2。如果你对查看所有92种解决方案不感兴趣,只需按住Enter键并保持几秒钟即可。

这个程序的运行结果在这里给出:

 image.png

工作原理

LOC 5~10定义main()函数。在LOC 7中,int变量p的值设置为8,因为棋盘上的皇后数是8。在LOC 8中,调用函数queen()。queen()的第一个参数是int值1,它表示第1行,queen()的第二个参数是int变量p,p的值设置为int值8(即棋盘上的皇后个数)。LOC 47~61定义了函数queen()。函数queen()调用函数place()来检查放置情况(正在考虑中)对于皇后是否安全。如果一切正常,则place()返回1,一旦找到了皇后的一种成功放置情况,那么函数queen()调用函数print()来在屏幕上显示成功的放置情况,如LOC 56所示。在LOC 58中,函数queen()递归调用自己,进一步调查正在考虑的放置情况。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。