- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构课程设计-用C语言解决八皇后问题
1 引 言
在程序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。
在结构化程序设计中关键是如何将问题域中的行为(即操作)抽取出来,作为C++程序中的函数。由于多个函数均需要访问某些数据,这些数据常被设计为全局变量。
而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C++程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束[1]。
1.1课程设计目的
深入理解数据结构的基本理论,掌握数据存储结构的设计方法,掌握基于数据结构的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。在实践中培养独立分析问题和解决问题的作风和能力。熟练运用C++语言、基本数据结构和算法的基础知识,独立编制一个具有中等难度的、解决实际应用问题的应用程序。
依据“分而治之”的思想,先讨论4皇后的问题。也就是说在4×4的盘内放4个后。8皇后的问题实际上是4皇后问题的衍生。如图2.1所示。
图2.1 模拟棋盘图
首先清理棋盘,把所有的坐标值都归零,,如图2.2所示。
图 2.2 棋盘坐标清零
然后放第一个Q1到(1,1)的位置,。即Q1.row=1,Q1.col=1,如图2.3所示。
图2.3 放入第一颗棋子
Q1会占据它所在的所有横,竖,斜的位置。调用seize(1,1)函数来实现这个功能。让Q1所在的横竖斜线上所在的坐标都置1,如图2.4所示。
图2.4 继续探索
接着放Q2。放Q2的过程可以看作是在4×3的棋格里放Q2-Q4的过程。其中3×3的棋格中间斜线被Q1占据,因此Q2放在(2,3)的位置。即Q2.row=2,Q2.col=3。放完Q2后,调用seize(2,3)函数来实现Q2的占据坐标,如图2.5所示。
图2.5 划出下一颗棋子可能的区间
接下来要放Q3,可以看作是一个在4×2的棋格里放Q3、Q4。但是我们看到第3行已经没有空位放Q3了。因此回退到Q2的时刻,把Q2往后放,寻找第2个适合Q2的位置。若没有位置可放,则退回到Q1改变Q1的位置,如图2.6所示。
图2.6 放入第二颗棋子
Q2从(2,3)的位置出来后,可以放在(2,4)的位置。即Q2.row=2,Q2.col=4。如此Q3便可放到(3,2)的位置,如图2.7所示。
图2.7 继续探索
但是如此一来,Q3放在(3,2)的位置会占据Q4(4,3)的位置使Q4无法安放。所以应该回退到Q1。使Q1放在(1,2)的位置,如图2.8所示。
图2.8 无解 退回Q1
Q2因为(2,1)(2,2)(2,3)都被Q1占据,因此只能放在(2,4)的位置,如图2.9所示。
图2.9 得出一个解
至此,我们已经得到4皇后的一个解,判断是否已解出的条件是Q4是否被安放成功。此时Q4被安置,得出一个解,因此应该输出4个Q的位置
调用函数print()输出此时的4个Q的位置。
输出以后程序还没有完,因为我们还没有把所有的棋盘都遍历完毕。Q1只是到了(1,2)。要到(1,4)以后程序才算结束。所以我们应该把Q1往后移动一位到(1,3)继续找解。Q1在(1,3)的时候重复上边的过程可以得到Q4的另一组解。
我们可以看到,四皇后的两个解是相对的(对称)。实际上皇后问题的任何一个解都有另外一个解和它相对应。因此皇后问题的解一定是一个偶数。
最后Q4到了(1,4)以后全部棋盘遍历完毕。输出所有的解。程序结束。
我们可以设计一个函数Queen(int i)来模拟4Q的递归调用。
另外需要一个seize(i,j)函数判断坐标(i,j)是否被占据。一个print()函数来打印解。因为整个函数调用是一个递归的过程,递归结束后一切解都被析构了,所以print()函数必须被安置在Queen(int k)函数里。
seize(i,j)函数作用是判断坐标(i,j)是否被占据,如占据则返回1,如没占据则返回0。我们往(3,2)中放Q3。在判断是否占据的时候,需要考虑3中情况:
1. 列上是否被占据了。即图中的(2,2)(1,2)两点,注意,在这里只需要判断i(既3)以上的坐标就行了,因为第3行以下不可能有Q,我们还没有放。因此不用判断(4,2)这个点。(2,2)(1,2)两点的坐标用算法表示可以写成
k=i-1 to 1;
if((k,j)==Q) retrun 1; return 0
2. 左斜线上是否被占据了。即图中的(2,1)。算法可以写成:
k=i-1 to 1
if((k,j-i+k)==Q)
return1;
re
您可能关注的文档
- 《这儿原来是一座村庄课件》小学语文北师大版五年级上册_11.ppt
- 成都市青白江区城乡商业网点规划(2007—2020).docx
- 我国氯丁胶粘剂的现状及其展望.doc
- 《这儿原来是一座村庄课件》小学语文北师大版五年级上册_12.ppt
- 《这儿原来是一座村庄课件》小学语文北师大版五年级上册_13.ppt
- 《这儿原来是一座村庄课件》小学语文北师大版五年级上册_15.ppt
- 《这儿原来是一座村庄课件》小学语文北师大版五年级上册_16.ppt
- 房地产住宅项目示范区总包建设工程施工合同.doc
- 房地产公司工程承包商管理制度.doc
- 房地产公司工程结算管理制度.doc
- 联营加工合同协议.docx
- 2025至2030年中国音乐娃娃数据监测研究报告.docx
- 2025至2030年中国预涂感光版数据监测研究报告.docx
- 2025至2030年中国音响塑胶外壳数据监测研究报告.docx
- 2025至2030年中国预调测量仪数据监测研究报告.docx
- 2025至2030年中国风机盘管电动阀数据监测研究报告.docx
- 2025至2030年中国预硬高韧性热作模具钢数据监测研究报告.docx
- 2025至2030年中国领台订位系统数据监测研究报告.docx
- 2025至2030年中国音乐闪光彩蝶数据监测研究报告.docx
- 2025至2030年中国项目成本管理系统数据监测研究报告.docx
文档评论(0)