实验报告
——八皇后问题求解(递归和非递归)
学号: 专业年级: 姓名:
一、需求分析(要实现的功能描述)
八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n= 1或n ≥ 4时问题有解。八皇后问题最早是由国际囯际象棋棋手马克斯·贝瑟尔于1848年提出。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。
八皇后问题实现了在棋盘上摆放八个皇后的功能,这八个皇后任意两个皇后都不能处于同一条横行、纵行或斜线上。
测试数据可以通过手工寻找三组满足需要的值,测试数组(M,N),其中M代表皇后所在的行,N代表皇后所在的列。例如,第一组测试数据:
(1,4)、(2,7)、(3,3)、(4、8)、(5,2)、(6,5)、(7,1)、(8,6);第二组测试数据(1,5)、(2,2)、(3,4)、(4,7)、(5,3)、(6,8)、(7,6)、(8,1);第三组测试数据:
(1,4)、(2,2)、(3,7)、(4,3)、(5,6)、(6,8)、(7,5)、(8,1)。最后与编程求得的结果进行比较。如果这三组数据在最后编程求得的结果中,说明程序的编写基本没有什么问题。
二、概要设计
在进行概要设计的过程中,要清楚整个程序包含的功能模块及模块间的调用关系。
对于八皇后问题,整个程序中应该包括主函数模块,摆放皇后的函数模块,以及判断皇后的位置是否摆放正确的判断模块。对于模块间的关系,在运行主函数的过程中会调用摆放皇后的函数模块,在摆放皇后的函数模块中,又会调用判断皇后位置是否摆放正确的判断模块。
三、详细设计
抽象数据类型中定义的各种操作算法实现(用N-S图描述)
对于求解八皇后问题的非递归算法,N-S图如下:
运行queens函数
定义8个皇后,并且开辟9个空间(a[0]不用)初始化为0,初始化k为第一列,即k=1;
当k>0时候
在a[k]的位置上摆放一个皇后,即皇后的位置用数组表示为(a[k],k)
当摆放皇后没有到列的最底部,并且摆放不冲突的时候
将皇后下移一位
皇后位置到达底部?
是 否
回溯到k-1步
八列皇后全摆放完毕?
是否
打印出皇后摆放的情况
继续摆放下一列
初始化a[k]=0
对于八皇后问题求解的递归算法,N-S图如下:
调用queen函数,摆放第k个皇后(k从1开始)
是否将最后一个皇后摆放完毕?
是否
打印摆放皇后的情况
检测摆放的皇后是否冲突
是否
重新摆放
继续摆放下一个皇后
四、调试分析
过程中出现的问题及解决方法
由于对于C语言编程问题掌握的并非十分熟练,因而在程序的调试过程中出现了一些问
八皇后问题实验报告 来自淘豆网m.daumloan.com转载请标明出处.