c++八皇后问题课程设计
- 格式:doc
- 大小:785.77 KB
- 文档页数:19
8皇后问题课程设计一、课程目标知识目标:1. 理解“8皇后问题”的定义,掌握其基本的数学原理;2. 学会使用编程语言解决“8皇后问题”,并理解算法的执行过程;3. 了解“8皇后问题”在计算机科学和人工智能领域的应用。
技能目标:1. 能够运用逻辑思维和分析能力,设计出解决“8皇后问题”的算法;2. 培养编程能力,通过编写代码实现“8皇后问题”的求解;3. 提高问题解决能力,学会将现实问题转化为计算机程序进行处理。
情感态度价值观目标:1. 培养学生对计算机科学和数学问题的兴趣,激发学习热情;2. 培养学生的团队协作精神,鼓励在解决问题时互相交流、共同进步;3. 增强学生的自信心,让他们在解决“8皇后问题”的过程中体验成功的喜悦。
课程性质:本课程为信息技术与数学跨学科的综合课程,旨在培养学生的逻辑思维、编程能力和问题解决能力。
学生特点:学生处于八年级,已具备一定的数学基础和逻辑思维能力,同时对编程有一定了解。
教学要求:教师需结合学生的特点,采用任务驱动法,引导学生主动探究“8皇后问题”的解决方法,并通过实践操作,提高学生的编程能力和问题解决能力。
在教学过程中,注重培养学生的团队协作和自信心。
通过本课程的学习,使学生能够将所学知识应用到实际生活中。
二、教学内容1. 导入新课:通过讲解“8皇后问题”的历史背景和现实意义,激发学生的学习兴趣。
2. 理论知识学习:a. 介绍“8皇后问题”的定义及数学原理;b. 分析“8皇后问题”的约束条件和求解方法;c. 讲解“8皇后问题”在计算机科学和人工智能领域的应用。
3. 编程实践:a. 教学基础的编程语法和逻辑控制结构;b. 引导学生设计并实现解决“8皇后问题”的算法;c. 介绍编程工具和调试方法,帮助学生解决编程过程中遇到的问题。
4. 任务驱动:a. 布置小组任务,要求学生合作完成“8皇后问题”的求解;b. 学生通过讨论、实践,不断优化算法,提高求解效率;c. 教师巡回指导,针对学生遇到的问题给予解答和指导。
八皇后c语言课程设计一、课程目标知识目标:1. 学生能理解“八皇后”问题的背景和数学原理,掌握利用计算机程序解决问题的基本思路。
2. 学生能掌握C语言的基本控制结构,包括循环、选择和函数调用。
3. 学生能运用数组和逻辑判断解决排列组合问题,实现对八皇后问题的所有有效解的搜索。
技能目标:4. 学生能够运用C语言编写程序,实现八皇后问题的算法,并能够调试和优化代码。
5. 学生能够通过分析问题,设计出有效算法,培养逻辑思维能力和问题解决能力。
情感态度价值观目标:6. 学生通过解决八皇后问题,培养对计算机编程的兴趣和热情,增强对信息科学的认识。
7. 学生在学习过程中,培养团队合作意识和探究精神,提高面对复杂问题的耐心和毅力。
8. 学生能够认识到编程在解决实际问题中的应用价值,激发其在未来学习和工作中运用编程技术的积极性。
二、教学内容本课程将依据以下教学内容展开:1. C语言基础知识回顾:变量定义、数据类型、运算符、输入输出、控制结构(循环、选择)。
- 教材章节:第1章 C语言概述,第2章 数据类型与运算符,第3章 控制结构。
2. 数组的应用:一维数组的使用,理解数组在存储多数据时的优势。
- 教材章节:第4章 数组与字符串。
3. 函数的定义与调用:编写和调用自定义函数,理解模块化编程的重要性。
- 教材章节:第5章 函数。
4. 八皇后问题背景介绍:问题的起源、数学原理和解决思路。
- 教材章节:附录 或 课外拓展内容。
5. 八皇后算法设计:回溯法的基本原理,以及其在八皇后问题中的应用。
- 教材章节:算法设计与分析部分。
6. 编程实践:学生动手编写C语言程序解决八皇后问题,包括代码调试和优化。
- 教材章节:编程实践案例。
7. 算法优化:讨论如何提高程序的效率和减少计算时间,引入递归和剪枝的概念。
- 教材章节:算法优化部分。
教学内容将按照上述大纲逐步进行,确保学生能够系统地掌握C语言编程基础,并能将其应用于解决实际问题。
八皇后问题学2012年 9 月 5 日目录一、选题1.1背景知识 (2)1.2设计目的与要求 (2)二、算法设计2.1问题分析 (3)2.2算法设计 (3)三、详细设计3.1源程序清单 (4)四、调试结果及分析4.1调试结果 (6)4.2调试分析 (7)五、课程设计总结5.1总结及体会 (7)六、答辩6.1答辩记录 (8)6.2教师意见 (8)一、选题及背景知识1.1 背景知识在国际象棋中,皇后是一个威力很大的棋子,她可以“横冲直撞”(在正负或垂直方向走任意步数),也可以“斜刺冲杀”(在正负45度方向走任意步数),所以在8*8的棋盘上要布互相不受攻击的皇后,最多只能布八个,共92种布法,再也不能有别的布法了——这就是著名的八皇后问题在8*8的国际象棋棋盘上,放置八个皇后,使得这八个棋子不能互相被对方吃掉。
也就是说一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子.因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。
1.2 设计要求要求:·判断在国际象棋中,能否在空棋盘上摆放8个皇后,并使其中任意两个皇后不能在同一行,同一列或同一对角线上。
·编写完整的摆放八皇后问题的程序·具体要求第一个皇后的起始位置由键盘输入二、算法设计2.1问题分析设计——图形表示下图中,Q代表皇后假设在第k列上找到合适的位置放置一个皇后,要求它与第1——k-1列上的皇后不同行、列、对角线;可以从图上找到规律:不同列时成立,皇后放在第k列上;讨论行时,第j个皇后的位置(a[j] ,j)要与(i,k)位置的皇后不同行;如果同在/斜线上,行列值之和相同;如果同在\斜线上,行列值之差相同;如果斜线不分方向则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同,可表示为(|a[j]-i|=|j-k|)。
2.2 算法设计利用计算机运行速度快的特点,采用枚举法,逐一尝试各种摆放方式,来判断最终摆法。
2014年春季学期《C项目设计》报告题目:八皇后问题学号:092213112姓名:刘泽中组名:1指导教师:宋东兴日期:2014.05.15目录正文 (3)1.问题描述 (3)2. 总体设计与分析 (3)3. 相关代码 (5)4. 调试分析 (9)5.软件使用说明书 (11)总结 (11)附录:部分原程序代码 (12)一、问题描述1.八皇后问题:是一个古老而著名的问题。
该问题是十九世纪著名的数学家高斯1850年提出:在8×8棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?2.解决八皇后问题的关键在于:(1)找到合理的数据结构存放棋子的摆放位置。
(2)要有合理的冲突检查算法。
采用的方法是,先把8个棋子摆在棋盘上,每行摆一个,然后去检查这种摆放是否有冲突,如果没有冲突,即找到了一种解决方案。
由于皇后的摆放位置不能通过某种公式来确定,因此对于每个皇后的摆放位置都要进行试探和纠正,这就是“回溯”的思想。
在8个皇后未放置完成前,每行摆放一个皇后,摆放第i个皇后和第i+1个皇后的试探方法是相同的,因此完全可以采用递归的方法来处理。
二、总体设计与分析1.设计效果画一个8*8的国际象棋盘,在棋盘某一位置上放一棋子,并让它按从左到右的方向自动运动,用户可以使用光标键调整棋子运动的方向,找出所有可能的摆放方案,将包含指定的棋子的(如3行4列)摆放方案找出并显示出来。
2.、总体设计程序总体分为两大块:(1)八皇后摆法的寻找;(2)棋盘及棋子的设计。
3、详细模块(1)八皇后摆法的寻找:int chess[8][8]={0}; //二维数组表示8*8棋盘,全部清0,(0代表该位没有放棋子)void queen(int i,int n){ //i表示从第i行起为后续棋子选择合适位置,n代表n*n棋盘if(i==n)output(n); //输出棋盘当前布局;else{for(j=0;j<n;j++){ //每行可能有n个摆放位置chess[i][j] = 1; //在第i行,j列上放一棋子if(!canAttack(i,j)) //如果当前布局合法,不受前i-1行的攻击queen(i+1,n); //递归摆放i+1行chess[i][j] = 0; //移走第i行,j列的棋子}}}int canAttack(int i,int j){ //判断0到i-1行已摆放的棋子,对[i,j]位置是否可以攻击for(m=0;m<i;m++){for(n=0;n<8;n++){if(chess[m][n]==1){if(m==i||n==j) return 1;if(m+n==i+j || m-n==i-j) return 1;}}}return 0;}void output(){ //输出一组解,即打印出8个皇后的坐标for(int i=0;i<8;i++){for(int j=0;j<8;j++){if(chess[i][j]==1){printf("(%d,%d)",i,j);}}}printf(“\n”);}int main(){queen(0,8);return 0;}(2)棋盘及棋子的设计:void drawBlock(int i,int j){ //棋盘的设计(每一个小方块)int x0,y0,x1,y1;x0=ORGX+j*W;y0=ORGY+i*H;x1=x0+W-1;y1=y0+H-1;setcolor(WHITE);rectangle(x0,y0,x1,y1);setfillstyle(1,LIGHTGRAY);floodfill(x0+1,y0+1,WHITE);setcolor(WHITE);line(x0,y0,x1,y0);line(x0,y0,x0,y1);setcolor(BLACK);line(x1,y0,x1,y1);line(x0,y1,x1,y1);}void drawBall(Ball ball){ //棋子的设计int x0,y0;x0=ball.startX+ball.c*ball.w+ball.w/2;y0=ball.startY+ball.r*ball.h+ball.h/2;setcolor(RED);setfillstyle(1,RED);fillellipse(x0,y0,10,10);}4.程序设计思路:先设计程序,找到八皇后的摆放位置,方法是:先把8个棋子摆在棋盘上,每行摆一个,然后去检查这种摆放是否有冲突,如果没有冲突,即找到了一种解决方案。
八皇后问题课程设计1设计背景1.1课程设计的目的本课程设计的目的在于提高学生对数据结构和C++语言课程的运用能力,并能使学生加深对数据结构和编程工作的理解。
书本知识转化成个人能力,最终还是要靠不断地付诸实践,课程设计恰为这种时间提供了一个很好的平台。
1.2课程设计任务与要求程序启动后显示一张8*8的棋盘,然后游戏者可以用坐标输入方式在棋盘上布下棋子。
如果布下的棋子合法,则增加10分并可以继承布下一个棋子。
如果布下的棋子不合法,给出游戏者的得分数。
若无错误布下8颗棋子,则给与满分100分。
(由于本学期我们尚未学习图形界面的有关类容,所以课程设计中的有关图形界面的内容进行了修改。
)游戏规则要求不能在同一行或同一列或同一条对角线上放置二个或二个以上的棋子,但每行都必须放置一个棋子。
2 程序的实现过程2.1设计思想、算法及实现要点程序编写都是由简单到复杂的,接到任务以后,就在脑子里有了一个大概的框架。
一个while(1)的打循环里嵌套一个界面输入程序,通过用户不断地输入来控制游戏的循环的继续和跳出,并且在设计一个自动跳出的判断语句。
这样,玩家就能在循环体里不断布棋,直到玩家想终止游戏或者游戏过关成功。
关于下棋系统,首先要处理的就是棋盘,我把棋盘用赋值为0或1的二维数组来模拟国际象棋棋盘。
0代表无棋子,1代表已下的棋子。
这样就比较方便我以后判断棋盘横竖斜有且只有一个棋子,只需将横竖斜的元素累加,结果等于1即可。
由于没有真正的图形界面,下棋的方法就只能依靠用户输入横竖坐标了,输入坐标后,系统自动将该坐标位置的元素赋值为1。
关于打分细则,我的设计是给一个基准分20分,正确下一个棋就加10分,这样,当游戏过关时恰好是100分。
具体到实际编程时,又考虑到,游戏程序的可玩性问题,我又在之前的的简单框架上补充了悔棋的功能,并且能一次性悔多步棋子,这样,打分细则又改变了:起评分20分下对一颗棋子奖励10分,若要悔棋,悔棋一步扣除15分。
6 八皇后问题【问题描述】在一个8×8的国际象棋棋盘上放置8个皇后,要求每个皇后两两之间不“冲突”,即没有一个皇后能“吃掉”任何其他一个皇后,简单的说就是没有任何两个皇后占据棋盘上的同一行或同一列或同一对角线,即在每一横列、竖列、斜列都只有一个皇后。
/*file name:Queen.cDescription:利用递归法求出8个皇后问题的解*/#include<stdio.h>#include<conio.h>#define TRUE 1#define FALSE 0#define MAXQUEEN 8#define ABS(x) ((x>0)?(x):-(x)) /*求x的绝对值*//*存放8个皇后的列位置,数组注标为皇后的列位置*/int queen[MAXQUEEN];int total_solution; /*计算共有几组解*//*函数原型声明*/void place(int);int attack(int,int);void output_solution();void main(){place(0); /*从第0个皇后开始摆放至棋盘*/getch();}void place(int q){C语言大学实用教程学习指导·268·int i=0;while(i<MAXQUEEN){if(!attack(i,q)) /*皇后未受攻击*/{queen[q]=i; /*储存皇后所在的列位置*//*判断是否找到一组解*/if(q==MAXQUEEN-1)output_solution(); /*列出此组解*/elseplace(q+1); /*否则继续摆下一个皇后*/}i++;}}/*测试在(row,col)上的皇后是否遭受攻击若遭受攻击则返回值为1,否则返回0*/int attack(int row,int col){int i,atk=FALSE;int offset_row,offset_col;i=0;while(!atk&&i<col){offset_col=ABS(i-col);offset_row=ABS(queen[i]-row);/*判断两皇后是否在同一列,是否在同一对角线*//*若两皇后在同列或同对角线,则产生攻击,atk==TRUE*/atk=(queen[i]==row)||(offset_row==offset_col);i++;}return atk;}/*列出8个皇后的解*/void output_solution()第3章学习指导·269·{int x,y;total_solution+=1;printf("Solution#%3d\n\t",total_solution);for(x=0;x<MAXQUEEN;x++){for(y=0;y<MAXQUEEN;y++)if(x==queen[y])printf("Q"); /*用字母Q表示皇后*/elseprintf("-"); /*用-表示空白*/printf("\n\t");}printf("\n");}。
数据结构课程设计姓名:学号:指导老师:目录一.选题概述——--———--——--—-—————---——-—-—-——---—-——3二.设计要求与分析-———---—-----——--——--—————-—-———3三.数据结构与定义-———--————---——-—-——-—-—————-—--41。
结构体定义2。
函数定义3。
函数之间的定义四.程序段与分析---———-———--—-—-———————--—--—---——5五.完整程序代码及运行结果截图---—-———-———-—————7六.心得体会-———-—-——---———-——-————-———————---——--10七.参考文献——————-——--——————-——--—---—-———-—--—--10一.选题概述:在实际应用中,有相当一类问题需要找出它的解集合,或者要求找出某些约束条件下的最优解.求解时经常使用一种称为回溯的方法来解决.所谓回溯就是走回头路,该方法是在一定的约束条件下试探地搜索前进,若前进中受阻,则回头另择通路继续搜索。
为了能够沿着原路逆序回退,需用栈来保存曾经到达的每一个状态,栈顶的状态即为回退的第一站,因此回溯法均可利用栈来实现。
而解决八皇后问题就是利用回溯法和栈来实现的。
二.设计要求与分析八皇后问题是在8x8的国际象棋棋盘上,安放8个皇后,要求没有一个皇后能够“吃掉”任何其他一个皇后,即没有两个或两个以上的皇后占据棋盘上的同一行、同一列或同一条对角线。
八皇后在棋盘上分布的各种可能的格局,其数目非常大,约等于232种,但是,可以将一些明显不满足问题要求的格局排除掉。
由于任意两个皇后不能同行,即每一行只能放置一个皇后,因此将第i个皇后放置在第i行上。
这样在放置第i个皇后时,只要考虑它与前i 一1个皇后处于不同列和不同对角线位置上即可.因此,其算法基本思想如下:从第1行起逐行放置皇后,每放置一个皇后均需要依次对第1,2,…,8列进行试探,并尽可能取小的列数。
设计任务书课题 八皇后 名称 1. 2. 3. 4. 调研并熟悉八皇后的基本功能、数据流程与工作规程; 学习八皇后相关的算法和基于 VC++集成环境的编程技术; 通过实际编程加深对基础知识的理解,提高实践能力; 学习开发资料的收集与整理,学会撰写课程设计报告。
设计 目的实验 环境1. 2. 1.微型电子计算机(PC); 安装 Windows 2000 以上操作系统,Visual C++6.0 开发工具。
利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要 求,注意材料收集与整理; 在第 16 周末之前完成预设计,并请指导教师审查,通过后方可进行下一步工作; 本课题要求至少用三种方法解决八皇后问题,输入棋盘的阶层,然后显示共有多 少种布局方案,并显示每一种方案的具体情况。
结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、 结论正确,正文字数不少于 3000 字(不含代码)。
工作进度计划 起止日期 2009.06.7~2009.06.7 工 作 内 容任务 要求2. 3. 4.序号 1在预设计的基础上,进一步查阅资料,完善设计方案,形 成书面材料。
设计总体方案,构建、绘制流程框图,编写代码,上机调 试。
测试程序,优化代码,增强功能,撰写设计报告。
提交软件代码、 设计报告, 参加答辩, 根据教师反馈意见, 修改、完善设计报告。
2 3 42009.06. 7~2009.06.10 2009.06.11~2009.06.12 2009.06.12~2009.06.13指导教师(签章):年月日摘要: 众所周知的八皇后问题是一个非常古老的问题,具体如下:在 8*8 的国际象棋棋 盘上放置了八个皇后,要求没有一个皇后能吃掉另一个皇后,即任意两个皇后都不处 于棋盘的同一行、同一列或同一对角线上,这是做出这个课题的基础。
要求编写实现八 皇后问题的递归解法或非递归解法,对于任意给定的一个初始位置,输出八皇后问题 的一个布局。
C++课程设计课程设计题目:八皇后问题姓名:xxx专业:xxx班级:xxxxxx学号:xxxxxxxx指导教师:xxx日期:2014年6月17日目录1 课题综述 (2)1. 1课题的来源及意义------------------------------------------------------------------------------------ 21.2 预期目标---------------------------------------------------------------------------------------------- 21.3 八皇后问题课题要求------------------------------------------------------------------------------- 31.4面对的问题------------------------------------------------------------------------------------------- 42 需求分析 (4)2.1涉及到的知识 ------------------------------------------------------------------------------------------ 42.2总体方案 ----------------------------------------------------------------------------------------------- 62.3 软件的需求 (7)2.4 功能需求 (7)3 模块及算法设计 (7)3.1算法描述 ----------------------------------------------------------------------------------------------- 73.2.详细流程图 ------------------------------------------------------------------------------------------ 94.程序代码 (10)5 程序调试分析 (14)6 运行与测试 (15)7总结 (18)8致谢 (19)参考文献 (19)1.课题综述1. 1课题的来源及意义八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。
在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。
所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。
到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。
运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。
1.2 预期目标运用C++程序设计的编程思想编写代码,实现八皇后问题的所有(92种)摆放情况。
要求在DOS界面上显示出每一种方式。
1.3 八皇后问题课题要求输入后,显示X,Y以及共有多少种布局方案,并显示每一种方案的具体情况77: (0,2) (1,0) (2,6) (3,4) (4,7) (5,1) (6,3) (7,5)78: (0,7) (1,1) (2,4) (3,2) (4,0) (5,6) (6,3) (7,5)输出样式实例1.4面对的问题需要用三种方法解决八皇后问题,在这里需要查阅大量资料并多加练习,才能成功编写程序。
主要要解决下面的问题:冲突:包括列、行、两条对角线;1.列:规定每一列放一个皇后,就不会造成列上的冲突;2.行:当第i行被某个皇后占据时,该行所有空格就都不能放置其他皇后;3.对角线:对角线有两个方向,在同一对角线上的所有点都不能有冲突。
2.需求分析2. 1 涉及到的知识在本次的课程设计中,用到的知识点主要有:类、函数、选择结构里的条件语句、循环结构里的while语句以及for循环语句、控制语句里的break语句、以及字符串函数的运用等等,并且应用到递归、回溯及穷举等比较经典的算法。
2.1.1类2.1.1.1 类定义类就是用户自定义的数据类型。
类定义的一般形式如下:class 类名{细节;(数据成员,成员函数)};2.1.1.2 类函数定义类成员函数类的成员函数通常在类外定义,一般形式如下:返回类型类名::函数名(形参表){函数体;}双冒号: :是域运算符,主要用于类的成员函数的定义。
2.1.2函数2.1.2.1 函数的定义定义函数需要指明:函数执行结果返回值的类型、函数名、形式参数(简称形参)和函数体。
一般形式为:数据类型函数名(行参表){语句序列;Return 合适类型数值}2.1.2.2 数据类型规定了函数返回值类型。
执行函数体中的语句后,通常会产生一个结果,这就是函数的返回值,它可以是任何有效的类型。
若函数执行后不返回值,数据类型习惯用void来表示。
如果在函数定义时没有数据类型出现,则默认为函数返回值为整型(int)。
2.1.2.3 函数调用调用一个函数之前必须对该函数进行说明。
函数调用由函数名和函数调用运算符( )组成,( )内有0个或多个逗号分隔的参数(称为实参)。
每一个参数是一个表达式,且参数的个数与参数的类型要与被调函数定义的参数(称为形参)个数和类型匹配。
当被调函数执行时,首先计算实参表达式,并将结果值传送给行参,然后执行函数体,返回的返回值被传送到调用函数。
如果函数调用后有返回值,调用表达是可以用在表达式中,而无参函数的调用是一个单独的语句。
2.1.3 选择结构2.1.3.1 用if语句实现选择结构设计if语句的基本形式可分为两种:(1)if (表达式) 语句其执行过程是,首先计算表达式的值,若不为0,条件判断为真,则执行( )后面的语句,否则,if语句中止执行,即不执行( )后面的语句。
(2)if(表达式) 语句1else 语句2其执行过程是,首先计算表达式的值,若不为0,条件判断为真,则执行( )后面的语句,否则执行语句2。
2.1.3.2 if语句嵌套if语句中的任何一个子句可以是任意可执行语句,当然也可以是一条if语句,这种情况称为if语句嵌套。
当出现if语句的嵌套时,不管书写格式如何,else格式都将与它前面最靠近的未曾配对的if语句相配对,构成一条完整的if语句。
它的格式为:if(表达式1) 语句1;else if (表达式2)语句2;……else if (表达式n)语句n;else 语句n+1;2.1.3.3 while和do-while语句while语句用来实现“当型”循环结构,即先判断表达式,然后判断循环条件是否成立。
其一般形式为:do{语句;//循环体}while(条件表达式);其中要注意的是while后面的括号理是表达式而不是语句,表达式是没有分号的;而do-while中最后结束时要有分号。
2.1.4循环结构2.1.4.1 for语句这种循环语句不仅用于循环次数已知的情况,还能用于循环次数预先不能确定只给出循环结束条件的情况下。
for 语句的一般形式:for (表达式1;表达式2;表达式3){语句;//循环体}其执行的过程有以下几个步骤:求解表达式1;求解表达式2,若其值为真,则执行for语句中指定的循环体语句,然后执行下面的第3)步。
若为假,则结束循环;求解表达式3;转回上面第2)步继续执行;循环结束,执行for语句后面的其他语句。
2.2总体方案显然问题的关键在于如何判定某个皇后所在的行、列、斜线上是否有别的皇后;可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列号相同;如果同在\斜线上的行列值之和相同;如果同在/斜线上的行列值之差相同;如果斜线不分方向,则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同。
下图是一个范例(是棋盘中八皇后位置显示)将把皇后问题用三种方法表示出来,三种方法用switch语句连接.●○○○○○○○○○○○●○○○○○○○○○○●○○○○○●○○○○●○○○○○○○○○○○●○○●○○○○○○○○○●○○○○棋盘中的八皇后位置显示2.3 软硬件的需求1)系统要求:win98以上操作系统;2) 语言平台:tc++或vc++6.0;2. 4 功能需求当运行程序时,在屏幕上显示每一种方法八个皇后的相对位置,要用比较直观的界面显示。
3.模块及算法设计3.1算法描述3.1.2 回溯法回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。
按选优条件向前搜索,以达到目标。
但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)|xi∈Si ,i=1,2,…,n},给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。
其中Si是分量xi的定义域,且|Si|有限,i=1,2,…,n。
我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。
回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T,把在E中求问题P的所有解转化为在T中搜索问题P的所有解。
树T类似于检索树,它可以这样构造:设Si中的元素可排成xi(1) ,xi(2) ,…,xi(mi-1) ,|Si| =mi,i=1,2,…,n。
从根开始,让T的第I层的每一个结点都有mi个儿子。
这mi个儿子到它们的双亲的边,按从左到右的次序,分别带权xi+1(1) ,xi+1(2) ,…,xi+1(mi) ,i=0,1,2,…,n-1。
照这种构造方式,E中的一个n元组(x1,x2,…,xn)对应于T中的一个叶子结点,T的根到这个叶子结点的路径上依次的n条边的权分别为x1,x2,…,xn,反之亦然。
另外,对于任意的0≤i≤n-1,E中n元组(x1,x2,…,xn)的一个前缀I元组(x1,x2,…,xi)对应于T中的一个非叶子结点,T的根到这个非叶子结点的路径上依次的I条边的权分别为x1,x2,…,xi,反之亦然。
特别,E 中的任意一个n元组的空前缀( ),对应于T的根。
因而,在E中寻找问题P的一个解等价于在T中搜索一个叶子结点,要求从T 的根到该叶子结点的路径上依次的n条边相应带的n个权x1,x2,…,xn满足约束集D的全部约束。