- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
李志伟1,河南 郑州曹阳2,张凯2( 1、郑州科技学院信息工程学院450064 2、郑州科技学院实验中心 河南 郑州 450064 )【
李志伟1,
河南 郑州
曹
阳2,
张
凯2
( 1、郑州科技学院信息工程学院
450064 2、郑州科技学院实验中心 河南 郑州 450064 )
【摘 要】: 八皇后问题是一个古老而著名的问题,是回溯法的典型算法。 对于八皇后问题的实现,如
果结合动态的图形演示,则可以使算法的描述更形象、更生动,还可以辅助教师进行教学演示,可以产生良 好的教学效果。
【关键词】: 数据结构;八皇后;回溯法;堆栈;非递归
1、八皇后问题概述:
八皇后问题是一个古老而著名的问题,
2.2 图形存取
在 Turbo C 环境中,图形的存取可用如下标准函数 实现:
size=imagesize (x1,y1,x2,y2) ; 返回存储区域所需字 节数。
arrow=malloc(size);建立指定大小的动态区域位图,
并设定一指针 arrow。
getimage(x1,y1,x2,y2,arrow);将指定区域位图存于一 缓冲区。
putimage(x,y,arrow,copy)将位图置于屏幕上以(x,y)
左上角的区域。
虽然,用递归或 while 循环实现八皇后乃至 n 皇后 问题效率较高,而且思路清楚,但是为了更好的体现八 皇后问题在数据结构与算法中的应用, 为数据结构的 初学者达到融会贯通的目的; 我们不妨尝试一下加入
是回溯法
的典型算法 。 该问题是十九世纪著名的数学家高斯
1850 年提出的, 主要目的是在一个 8×8 国际象棋盘 上,有 8 个皇后,每个皇后占一格;要求皇后间不会出 现相互“攻击”的现象,即不能有两个皇后处在同一行、 同一列或同一对角线上。
2、八皇后问题的方法实现
关于八皇后问题的解法有很多种,高斯认为有 76
种方案。 1854 年在柏林的象棋杂志上不同的作者发表 了 40 种不同的解, 后来有人用图论的方法解出 92 种
结果。 对于八皇后问题的实现,如果结合动态的图形演
示,则可以使算法的描述更形象、更生动,还可以辅助 教师进行教学演示,可以产生良好的教学效果。 同时也 是比较高效的方法之一,它主要解决两个问题:即回溯 算法的实现和图形存取。
2.1 回溯法实现
回溯法实现的主要思路首先是把棋盘的横坐标定
一个栈和非递归方法实现一下。
可以让读者体验一下
递归和非递归方法的区别,
能够让初学者学会递归和
非递归方法之间的转换。 本文将主要介绍采用堆栈非
递归实现数据结构中的经典算法八皇后问题。
3、堆栈的使用
堆栈是一种执行“后进先出”算法的数据结构。 它 是在内存中开辟一个存储区域, 数据一个一个顺序地
为 i,纵坐标定为 j,i 和 j 的取值范围是从 1 到 8。
当某
个皇后占了位置(i,j)时,在这个位置的垂直方向、水平
方向和斜线方向都不能再放其它皇后了。 在语句实现 中可定义如下三个整型数 组 :a[8],b[15],c[24]。 其 中 :
a[j-1]=1 表示第 j 列上无皇后;a[j-1]=0 表示第 j 列上
有皇后;b[i+j-2]=1 表示(i,j)的对角线(左上至右下)无 皇后;b[i+j-2]=0 表示(i,j)的对角线(左上至右下)有皇 后;c[i-j+7]=1 表示(i,j)的对角线(右上至左下)无皇后;
存入(也就是“压栈——push”)这个区域之中。
有一个
地址指针总指向最后一个压入堆栈的数据所在的数据
单元,存放这个地址指针的寄存器就叫做堆栈指示器。
开始放入数据的单元叫做“栈底”。 在压栈的过程中,每
c[i-j+7]=0 (i,j)的对角线(右上至左下)有皇后。
为第 i 个皇后选择位置,其算法实现如下:
for(j=1;j=8;j++) /* 第 j 个皇后在第 j 行 */
然后是
有一个数据压入堆栈,
就放在和前一个单元相连的后
面一个单元中,堆栈指示器中的地址自动加 1。 读取这
些数据时,按照堆栈指示器中的地址读取数据,堆栈指 示器中的地址数自动减 1。 这个过程叫做“弹出 pop”。
if ((i,j)位置为空)) /* 即相应的三个数组的对应元
素值为 1*/
如此就实现了后进先出的原则。
堆栈是计算机中最常
{占用位置
值为 0*/
if i8
(i,j) /* 置相应的三个数组对应的元素
用的一种数据结构,
比如函数的调用在计算机中是用
堆栈实现的。 堆栈可以用数组存储, 也可以用链表存
储。 堆栈的结构体定义如下:
#define MAX_SIZE 100 typedef int DATA_TYPE;
为 i+1 个皇后选择合适的位置;
else 输出一个解
}
{在非
文档评论(0)