数据结构中八皇后问题的堆栈非递归方法的实现研究.docVIP

数据结构中八皇后问题的堆栈非递归方法的实现研究.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

小教资源库 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档