八皇后实验报告.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验项目: 八皇后问题 实验目的:通过求解皇后问题,熟悉深度优先搜索法DFS(回溯法(Backtracking Algorithms)技术。 实验内容:由n2个方块排成n行n列的正方形称为n元棋盘。如果两个皇后位于n元棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。现要找出使棋盘上n个皇后互不攻击的布局。编制程序解决上述问题,以n=6运行程序,输出结果。 程序简介:将n个皇后放到一个n*n的方阵中,要求每个皇后不在同一行同一列及同一对角线,我的程序是先把每个皇后放在了第零列,然后再按行检查,不符合要求继续下一列,若已经到这一行的最后一列,还没找到符合要求的位置,则回到上一行。 算法设计介绍: 定义一个一维数组,数组的下标是皇后所在位置的行数,数组存的值是皇后所在位置的列数,现将A[0]-A[n-1]都赋成零,然后随着检查的进行,皇后的位置也在不断地变化,最后找到一个符合要求的方阵时,本质上就是一个存放整数的一维数组,数组的下标是行数,存放的值是列数。 5.困难及解答 我很久以前就听说过八皇后问题,没想到现在轮到自己编了,一开始还真是特别糊涂呢,后来老师上课把算法大概讲了一遍,就清楚很多了,要说问题,就是一开始纠结怎么存放皇后,我开始想用二维数组着,后来老师说用一维数组比较好做,我看了一下老师的算法,就明白了大概,经过一段时间就编出来了 心得 我编程变得还是很少,天天下决心说以后多编,也没践行,心想着吧,不挂在嘴上了,努力! 程序清单 /* // 我真诚地保证: // 我独立完成了整个程序从分析、设计到编码的所有工作。 // 如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中 // 详细地列举我所遇到的问题,以及别人给我的提示。 // 我的程序里中凡是引用到其他程序或文档之处, // 例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段, // 我都已经在程序的注释里很清楚地注明了引用的出处。 // 我从未没抄袭过别人的程序,也没有盗用别人的程序, // 不管是修改式的抄袭还是原封不动的抄袭。 // 我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转 文件名称: 创建者: 创建时间:2011.4.14 最后修改时间:2011.4.17 功能:不同个数皇后的排列问题,各个皇后不再同一行同一列以及同一对角线 文件中的函数名称和简单功能描述:bool unguarded(int A[],int m),检查A[]-1列和第m-1行的皇后有没有设防 文件中定义的全局变量和简单功能描述:无 文件中用到的他处定义的全局变量及其出处:无 与其他文件的依赖关系:独立 2.关于类的说明: 类名称:无 定义该类的目的: 类属性: 类中函数及功能: 与其他类的关系(调用/被调用哪类对象中的什么函数): 3. 关于函数的说明 (1) 函数名称:bool unguarded(int A[],int m) 函数功能描述:检查A[]-1列和第m-1的皇后是否设防 函数调用之前的预备条件:一位数组和整数m 返回后的处理:返回一个bool型的变量,若true,则下一个进入方阵的皇后可以放在这,反之,则不能; 返回值(如果有的话):true or false 函数的输入参数:无 函数的输出参数:无 */ #include "iostream" #define max 100 using namespace std; bool unguarded(int A[],int m) { int n; for(n=0;n<m;n++)//从第零行开始检查 { if((A[n]==A[m])||((A[n]+n)==(A[m]+m))||((A[n]-n)==(A[m]-m))||((n-A[n])==(m-A[m]))) //这种检查方法不包含同一行的情况,因为m不可能等于n return false; } return true; } int main() { int n,i,A[max],s=1; //用一维数组表示皇后的位置的思想来自课堂笔记 cout<<"请输入皇后的个数"<<endl; cin>>n; if((n<=3)||(n>=100)) cout<<"请不要输入1、2、3或者大于100的数!"<<endl;//一个没有意义,两个和三个不管怎么放都会在同一行和同一列 else{ for(i=0;i<n;i++) A[i]=0;//先把每个皇后放在第一列,然后按行检察 i=0;//然后从第零行开始 while(i>=0) //回溯结束的条件 { if(A[i]<=n-1) //当前行数的前

文档评论(0)

159****8201 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档