八皇后问题数据结构课程设计报告.docx

上传人:b****5 文档编号:3525945 上传时间:2022-11-23 格式:DOCX 页数:9 大小:88.40KB
下载 相关 举报
八皇后问题数据结构课程设计报告.docx_第1页
第1页 / 共9页
八皇后问题数据结构课程设计报告.docx_第2页
第2页 / 共9页
八皇后问题数据结构课程设计报告.docx_第3页
第3页 / 共9页
八皇后问题数据结构课程设计报告.docx_第4页
第4页 / 共9页
八皇后问题数据结构课程设计报告.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

八皇后问题数据结构课程设计报告.docx

《八皇后问题数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《八皇后问题数据结构课程设计报告.docx(9页珍藏版)》请在冰豆网上搜索。

八皇后问题数据结构课程设计报告.docx

八皇后问题数据结构课程设计报告

数据结构课程设计报告

八皇后问题

设计任务书

课题

名称

八皇后

设计

目的

1.调研并熟悉八皇后的基本功能、数据流程与工作规程;

2.学习八皇后相关的算法和基于VC++集成环境的编程技术;

3.通过实际编程加深对基础知识的理解,提高实践能力;

4.学习开发资料的收集与整理,学会撰写课程设计报告。

实验

环境

1.微型电子计算机(PC);

2.安装Windows2000以上操作系统,VisualC++6.0开发工具。

任务

要求

1.利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;

2.在第16周末之前完成预设计,并请指导教师审查,通过后方可进行下一步工作;

3.本课题要求至少用三种方法解决八皇后问题,输入棋盘的阶层,然后显示共有多少种布局方案,并显示每一种方案的具体情况。

4.结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、结论正确,正文字数不少于3000字(不含代码)。

工作进度计划

序号

起止日期

工作内容

1

2009.06.7~2009.06.7

在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。

2

2009.06.7~2009.06.10

设计总体方案,构建、绘制流程框图,编写代码,上机调试。

3

2009.06.11~2009.06.12

测试程序,优化代码,增强功能,撰写设计报告。

4

2009.06.12~2009.06.13

提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。

指导教师(签章):

2013年5月15日

 

摘要:

众所周知的八皇后问题是一个非常古老的问题,具体如下:

在8*8的国际象棋棋盘上放置了八个皇后,要求没有一个皇后能吃掉另一个皇后,即任意两个皇后都不处于棋盘的同一行、同一列或同一对角线上,这是做出这个课题的基础。

要求编写实现八皇后问题的递归解法或非递归解法,对于任意给定的一个初始位置,输出八皇后问题的一个布局。

本次设计旨在学习各种算法,训练对基础知识和基本方法的综合运用及变通能力,增强对算法的理解能力,提高软件设计能力。

在实践中培养独立分析问题和解决问题的作风和能力。

要求熟练运用C++语言、基本算法的基础知识,独立编制一个具有中等难度的、解决实际应用问题的应用程序。

通过对题意的分析与计算,用递归法回溯法及枚举法解决八皇后是比较适合的。

递归是一种比较简单的且比较古老的算法。

回溯法是递归法的升华,在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。

而枚举法,更是一种基础易懂简洁的方法。

把它们综合起来,就构成了今天的算法。

不论用什么法做这个课题,重要的就是先搞清楚哪个位置是合法的放皇后的位置,哪个不能,要先判断,后放置。

关键词:

八皇后;递归法;回溯法;数组…….

1课题综述

1.1八皇后问题概述

八皇后问题是一个古老而著名的问题。

该问题是十九世纪著名的数学家高斯1850提出;在8×8格的国际象棋上摆放八皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

高斯认为有76种方案。

1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后人有人用图论的方法解出92宗结果。

虽然问题的关键在于如何判定某个皇后所在的行、列、斜线是否有别的皇后;可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列号相同;如果同在“/”斜线上的行列值之和相同;如果在对角线上,则行列号之和或之差相等,逐个纪录符合题意的情况,最终得出解。

(如图1-1,是八皇后问题的一个实例图)

图1-1八皇后棋盘实例

1.2预期目标

运用C++程序设计的编程思想编写代码,实现八皇后问题的所有(92种)摆放情况。

要求在DOS界面上显示出每一种方式。

1

1.3面对的问题

需要用三种方法解决八皇后问题,在这里需要查阅大量资料并多加练习,才能成功编写程序。

主要要解决下面的问题:

冲突:

包括列、行、两条对角线;

1.列:

规定每一列放一个皇后,就不会造成列上的冲突;

2.行:

当第i行被某个皇后占据时,该行所有空格就都不能放置其他皇后;

3.对角线:

对角线有两个方向,在同一对角线上的所有点都不能有冲突。

2需求分析

2.1涉及到的知识基础

2.1.1类

2.1.1.1类定义

2.1.1.2类函数定义

2.1.2函数

2.1.2.1函数的定义

2.1.2.2函数调用

2.1.3选择结构

2.1.3.1用if语句实现选择结构设计

2.1.3.2if语句嵌套

2.1.3.3while和do-while语句

2.1.4循环结构

2.1.4.1for语句

2.1.4.2Break语句

2.1.5字符串处理函数

3模块及算法设计

3.1算法描述

3.1.1递归法

3.1.2回溯法

3.2.详细流程图

图3-3解决八皇后问题的基本流程图

4.代码编写

八皇后问题是在限制条件下的排序问题

#include//数据流输入/输出

#include//参数化输入/输出

#include//定义杂项函数及内存分配函数

#include//定义输入/输出函数

staticcharQueen[8][8];

staticinta[8];//数组a[i]:

a[i]表示第i个皇后放置的列,i的范围:

----8

staticintb[15];//主对角线数组

staticintc[15];//从对角线数组,根据程序的运行,去决定主从对角线是否放入皇后

staticintiQueenNum=0;//记录总的棋盘状态数

staticintiNum=1;

voidiQueen(inti);//参数i代表行

voidmeasure1()

{

intiLine;//横行

intiColumn;//纵行

for(iLine=0;iLine<8;iLine++)

{

a[iLine]=0;//列标记初始化,表示无列冲突

for(iColumn=0;iColumn<8;iColumn++)

Queen[iLine][iColumn]='*';

}

for(iLine=0;iLine<15;iLine++)//主、从对角线标记初始化,表示没有冲突

b[iLine]=c[iLine]=0;

iQueen(0);

};

voidiQueen(inti)//i为当前处理的行

{

intiColumn;

for(iColumn=0;iColumn<8;iColumn++)

{

if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0)//如果无冲突

{

Queen[i][iColumn]='@';//放皇后

a[iColumn]=1;//标记,下一次该列上不能放皇后

b[i-iColumn+7]=1;//标记,下一次该主对角线上不能放皇后

c[i+iColumn]=1;//标记,下一次该从对角线上不能放皇后

if(i<7)

iQueen(i+1);//如果行还没有遍历(沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问)完,进入下一行

else//否则输出

{

intiLine;//输出棋盘状态

intiColumn;

cout<<"(递归法)皇后摆放方式的第"<

"<

for(iLine=0;iLine<8;iLine++)

{

for(iColumn=0;iColumn<8;iColumn++)

cout<

(2)<

cout<

}

cout<

";

for(iLine=0;iLine<8;iLine++)

{

for(iColumn=0;iColumn<8;iColumn++)

{

if(Queen[iLine][iColumn]=='@')

cout<<"("<

}

}

cout<

system("pause>nul");//从程序里调用pause命令,一个结果一个结果地看

iNum++;

cout<

}

//如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重新标记

Queen[i][iColumn]='*';

a[iColumn]=0;

b[i-iColumn+7]=0;

c[i+iColumn]=0;

}//ifends

}

}

5程序调试分析

1)运行时有些函数的头文件未定义,导致无法进行编译;而且在调试时有些头文件的使用范畴弄混淆了;

2)开始编第一种方法(递归回溯)时,for与if的循环嵌套未能很好掌握,导致几次调试都出现比较严重的错误;且在运用该方法时,未能将八皇后问题的具体思路搞清,没有考虑“如果前次的皇后放置导致后面的放置无论如何都不能满足要求”的问题;

3)在统计方法的个数时,未将累加的那个整型变量进行初始化,导致无法显示,八皇后摆放的是“第X种情况”,也无法统计出八皇后的排列方式是否一定是92种情况。

5)未用setw()函数时,显示的结果相当难看,所定义的标志符都紧靠在一起;多加了一个换行符后,各种情况的间距增大,阅读时舒服多了;

6)如果将92种情形全部打印,则前面的几十种情况将无法显示出,要想看到前面的状态,必须添加一个控制语句,使其能一个一个的输出。

 

6运行与测试

开始运行界面,

按enter后如图6-1所示

 

图6-1递归回溯法界面

(这是把皇后第一种方法运行后显示的界面,其中*是棋盘中棋子的位置,@是棋盘中皇后的位置,坐标表示在当前情况下皇后所处位置)

 

总结

通过这次的课程设计,让我了解了八皇后这一经典的问题。

同时让我更好地掌握了栈思想以及一维数组等等知识,以及一些书本上没有的东西,这对我以后的学习生涯以及将来步入社会起到很大的帮助。

这次课程设计虽然花了我很多时间和精力,但很值得,因为它对我能力提高起到很大帮助。

这次课程设计也提醒我以前知识的匮乏,它给我敲响了警钟,让我意识到自己基础的不扎实.当然这次实验还是有很多问题的。

比如程序设计的界面不够好,一些程序并非自己所写,而是修改某些程序而成,但这些不该,在下次课程设计时不会再发生.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1