n阶魔阵和八皇后问题课程设计
- 格式:doc
- 大小:504.61 KB
- 文档页数:31
算法设计及分析n皇后问题---回溯求解国际象棋中皇后威力很大,它可以象“车”一样沿直线上下或左右移动;也可以如同“象”那样沿着斜线移动。
双方的皇后是不能在同一行或同一列或同一斜线上对持的。
那么,在一张空白的国际象棋盘上最多可以放上几个皇后并且不让它们互相攻击呢?这个问题是伟大数学家高斯在十九世纪中期提出来的,并作了部分解答。
高斯在棋盘上放下了N个互不攻击的皇后,他还认为可能有N种不同的放法,这就是有名的“N皇后”问题。
如果你动手试试,就一定会发现开头几颗皇后很容易放置,越到后来就越困难。
由于我们的记忆有限,很可能在某个位置放过子后来证明不行取消了,但是以后又重新放上子去试探,这样就会不断地走弯路,花费大量的精力。
因此,必须找到一个简易有效、有条不紊的法则才行。
回溯法的基本思想:对于用回溯法求解的问题,首先要将问题进行适当的转化,得出状态空间树。
这棵树的每条完整路径都代表了一种解的可能。
通过深度优先搜索这棵树,枚举每种可能的解的情况;从而得出结果。
在深度优先搜索的过程中,不断的将每个解(并不一定是完整的,事实上这也就是构造约束函数的意义所在)与约束函数进行对照从而删除一些不可能的解,这样就不必继续把解的剩余部分列出从而节省部分时间。
不妨以8皇后为例,设8皇后为x i,她们分别在第i行(i=1,2,3,4,5,6,7,8),这样问题的解空间就是一个8个皇后所在列的序号,为n元一维向量(x1,x2,,x3,x4,x5,x6,x7,x8),搜索空间是1≤x i≤8(i=1,2,3,4,5,6,7,8),共88个状态。
约束条件是8个点(1,x1),(2,x2),(3,x3),(4,x4),(5,x5),(6,x6),(7,x7),(8,x8)不在同一列和同一对角线上。
虽然问题共有88个状态,但算法不会真正地搜索这么多的状态,因为回溯法采用的是“走不通就掉头”的策略,而形如(1,1,x3,x4,x5,x6,x7,x8)的状态共有86个,由于1,2号皇后在同一列不满足约束条件,回溯后这些状态是不会搜索的。
关于c语言编程中八皇后问题的设计报告一、课题的来源及意义八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。
在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。
所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。
到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。
运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。
二、面对的问题1)解决冲突问题:这个问题包括了行,列,两条对角线;列:规定每一列放一个皇后,不会造成列上的冲突;行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;2)使用数据结构的知识,用递归法解决问题。
三、需求分析1、涉及到的知识本次设计中,用到的主要知识有:递归法的运用,for语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的掌握。
2、软硬件的需求1)系统要求:win xp以上操作系统;2)语言平台:tc++或vc++6.0;3、功能需求当运行程序时,在屏幕上显示每一种方法八个皇后的相对位置,要用比较直观的界面显示。
四、概要设计我的思想是用循环递归循环来实现的,分别一一测试了每一种摆法,并把它拥有的92种变化表现出来。
在这个程序中,我的主要思路以及思想是这样的:1)解决冲突问题:这个问题包括了行,列,两条对角线;列:规定每一列放一个皇后,不会造成列上的冲突;行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;对角线:对角线有两个方向。
八皇后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语言编程基础,并能将其应用于解决实际问题。
计算机科学与技术专业数据结构课程设计报告设计题目:八皇后问题目录1需求分析 (2)1.1功能分析 (2)1.2设计平台 (3)2概要设计 (3)2.1算法描述 (4)2.2算法思想 (5)2.3数据类型的定义 (5)3详细设计和实现 (6)3.1算法流程图 (6)3.2 主程序 (6)3.3 回溯算法程序 (7)4调试与操作说明 (9)4.1调试情况 (9)4.2操作说明 (9)5设计总结 (11)参考文献 (12)附录 (12)1需求分析1.1功能分析八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的,并作了部分解答。
高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有76种不同的放法,这就是有名的“八皇后”问题。
在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。
所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。
现在我们已经知道八皇后问题有92个解答。
1、本演示程序中,利用选择进行。
程序运行后,首先要求用户选择模式,然后进入模式。
皇后个数设0<n<11。
选择皇后个数后,进入子菜单,菜单中有两个模式可以选择。
2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令:相应的输入数据和运算结果显示在其后。
3、程序执行的命令包括:1)进入主菜单。
2)选择皇后问题,输入是几皇后。
3)进入子菜单。
4)选择皇后显示模式。
5)选择结束4、测试数据1)N的输入为4;2)共有2个解答。
3)分别是○●○○○○●○○○○●●○○○●○○○○○○●○○●○○●○○1.2设计平台Windows2000以上操作系统;Microsoft Visual C++ 6.02概要设计问题:N后问题问题描述:国际象棋中皇后可以攻击所在行,列,斜线上的每一个位置,按照此规则要在一个n*n的棋盘上放n个皇后使每一个皇后都不互相攻击问题分析:引入1个数组模拟棋盘上皇后的位置引入3个工作数组行数组[k]=1,表示第k行没有皇后右高左低数组[k]=1,表示第k条右高左低的斜线上没有皇后左高右低数组[k]=1,表示第k条左高右低的斜线上没有皇后观察棋盘找到规律同一右高左低的斜线上的方格,它们的行号和列号之和相等;同一左高右低的斜线上的方格,它们的行号和列号只差相等;开始时,所有行和斜线上都没有皇后,从第一列的第一行配置第一个皇后开始,在第m列的皇后位置数组[m]行放置了一个合理的皇后之后,准备考察第m+1列时,在数组行数组[],右高左低数组[],左高右低数组[]中为第m列,皇后位置数组[m]的位置设定有皇后标志如果按此放置位置得不到结果,则把当前列中的有皇后标记改为无皇后标记。
算法设计与分析实验报告—八皇后问题-姓名:***学号:********班级:软件83【问题描述】在国际象棋盘上放八个皇后,要求任一皇后吃不到别人,也不受其他皇后的攻击,求出问题的所有解。
【问题分析&算法设计】用8元组x[1: n]表示8后问题。
其中x[ i]表示皇后i放在棋盘的第i行的第x[ i]列。
由于不允许将2个皇后放在一列,所以解向量中的x[ i]互不相同。
2个皇后不能放在同一斜线上是问题的隐约束。
故若2个皇后放置的位置分别是(i,j)和(k,l),且i – j = k – l或i + j = k + l,则说明这2个皇后处于同一斜线上。
这两个方程分别等价于i – k = j – l和i – k = l – j。
由此可知,只要|i - k| = |j - l|成立,就表明2个皇后位于同一条斜线上。
问题的隐约束化成了显约束。
用回溯法解决8皇后问题时,用完全8叉树表示解空间。
【算法实现】#include "stdio.h"#include "math.h"#include "iostream.h"#define N 8 /* 定义棋盘大小*/static int sum; /* 当前已找到解的个数*/static int x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列*//* 每找到一个解,打印当前棋盘状态*/void Show(){sum++;cout << "第" << sum << "种情况:" << endl;cout << "坐标为:\t";for(int k = 0; k < N; k++)cout << '(' << k+1 << ',' << x[k] << ") ";cout << endl;cout << "---------------------------------\n";for (int i = 0; i < N; i ++){for (int j = 0; j < N; j ++)if (j == x[i]) //printf("@ ");cout << "* | ";else //printf("* ");cout << " | ";cout << "\n---------------------------------\n";}}/* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */int Judge(int k){// 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。
淮阴工学院C++程序设计课程设计报告选题名称:八皇后系(院):计算机工程系专业:计算机科学与技术班级:计算机1084姓名: XXX 学号:XXXXXXXXXX 指导教师:戴峻峰、赵建洋学年学期:2008 ~ 2009 学年第 2 学期2009 年 6 月13 日设计任务书指导教师(签章):年月日摘要:八皇后问题。
这是由大数学家高斯于1850年首先提出来的,要求在8*8的方格国际象棋盘上放置8个皇后,任意两个皇后不能位于同一行,同一列或同一斜线(正斜或反斜线)上。
输出所有可能的放法。
分析:解此问题的基本思路为:开始时棋盘为空,第二个皇后可在第一行的任意位置上放置。
一旦放置好第一个皇后,以后各行放置皇后时需检查当前列和同一斜线上是否已放置了皇后。
如果未放置,则当前位置可放新的皇后,否则需试新的位置。
假设前行的皇后已放好,现从当前行的第1列起选择适当的位置放置第5个皇后。
显然第1,2列不能放置,因为这两个位置与第1,2行皇后的位置起冲突。
第1个合适的位置是第3列(第4列也可以)。
如果试探结果本行中没有合适的位置,则说明前面的皇后放置的位置不对,应回退到上一行,释放皇后原来占据的位置,改试下一个合适的位置。
如果回退一行后本行仍然没有合适的位置,则继续回退;一旦当前的皇后放置好后,则前进一行放置下一个皇后。
如此下去,直至8个皇后化全部放置好后,则前进一行放置下一个皇后。
如此下去,直至8个皇后全部放置好时即可打印一个解。
关键词:八皇后,回溯法(试探法),递归法目录1 课程综述 (1)1.1课程来源及意义 (1)1.2预期目标 (1)1.3面对的问题 (1)1.4需解决的关键技术 (1)2 需求分析联系 (1)2.1涉及的知识基础 (1)2.2解决问题的思路 (3)2.3总体方案 (5)2.4功能模块框图 (5)3 模块及算法设计 (6)3.1算法描述 (6)3.2实现方法 (6)3.3流程图 (7)4 代码编写 (7)5程序调试 (15)5.1调试过程与步骤 (15)5.2发现的问题 (15)5.3解决的办法 (15)6 运行与测试 (15)7 结论 (17)总结 (18)致谢 (20)参考文献 (21)1 课程综述在国际象棋中,皇后是一个威力很大的棋子。
安徽省巢湖学院计算机与信息工程学院课程设计报告课程名称《数据结构》课题名称八皇后问题专业计算机科学与技术班级学号姓名联系方式指导教师2011 年 12 月 25日目录1、数据结构课程设计任务书.............................................................................................. 11.1、题目..................................................................................................................... 11.2、要求..................................................................................................................... 12、总体设计....................................................................................................................... 12.1、功能模块设计 ...................................................................................................... 12.2、所有功能模块的流程图........................................................................................ 23、详细设计....................................................................................................................... 53.1、程序中所采用的数据结构及存储结构的说明........................................................ 53.2、算法的设计思想................................................................................................... 53.3、稀疏矩阵各种运算的性质变换 ............................................................................. 54、调试与测试:................................................................................................................ 64.1、调试方法与步骤: ............................................................................................... 64.2、测试结果的分析与讨论: .................................................................................... 64.3、测试过程中遇到的主要问题及采取的解决措施:................................................. 65、时间复杂度的分析:..................................................................................................... 66、源程序清单和执行结果 ................................................................................................. 67、C程序设计总结 ........................................................................................................ 108、致谢.......................................................................................................................... 109、参考文献................................................................................................................... 101、数据结构课程设计任务书1.1、题目八皇后问题1.2、要求编写程序实现将八个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解。
经济管理学院本科课程设计论文数据结构课程设计学号:姓名:班级:专业:信息管理与信息系统系别: 管理系指导教师:2011 年 1 月 14日吉林目录第1章引言概述数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。
该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。
通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。
数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。
学习数据结构的最终目的是为了获得求解问题的能力。
对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。
进行课程设计是为了加强编程能力的培养,鼓励我们在学习完理论知识之后多动手同时发挥我们自主学习的能力。
相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,我们都会有不同程度上的提高。
第2章需求分析2.1问题描述2.1.1语言描述:给定一奇数n,构造一个n阶魔阵。
n阶魔阵是一个n阶方阵,其元素由自然数1,2,3,…,n2组成。
魔阵的每一行元素之和,每列元素之和以及主、副对角线元素之和均相等。
即对于给定的奇数n以及i=1,2,3,…,n,魔阵a满足条件:要求输出结果的格式要具有n阶方阵的形式。
2.1.2算法概述:依次将自然数填入方阵中,共填n轮,每轮填n次。
第一轮的第一次,将1填如入方阵的中间一行的最后一列位置。
设前一次填入的位置是,每轮中第2至第n次将数填入,若遇到下列两种情况之一,则填写位置按以下规则调整。
计算机与信息技术学院实验报告专业:计算机科学与技术年级/班级:2009级 2011—2012学年第一一、实验项目N皇后问题二、需求分析八皇后问题是一个古老而著名的问题。
该问题是十九世纪著名的数学家高斯1850年提出的。
八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既不攻击到另外七个皇后,也不被另外七个皇后所攻击。
按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子,问有多少种不同的摆法:并找出所有的摆法。
因此,八皇后问题等于要求八个皇后中的任意两个不能被放置在同一行或同一列或同一斜线。
本次实验算法设计中,用到的主要知识有:递归法的运用,for 语句的灵活运用,数据结构中树知识的灵活运用、数组及动态数组技术的掌握。
系统要求:win98 以上操作系统;语言平台:vc++6.0 或以上版本。
根据程序的设计要求,需要设计一个八皇后问题的演示程序,程序需要具备以下功能:能够快速查找并显示八皇后的布局方式有多少种正确方法。
能够逐个查看每种布局的结果。
能够很方便的改变皇后个数即棋盘规格。
三、概要设计:本实验是用递归和回溯法来实现的,分别测试了每一种摆法,并将一个解图形化显示输出。
在这程序中,思路主要是这样的:1、解决冲突问题和数据结构的实现对于数据结构的实现,则是着重于:(1)数组x[i]:表示第i个皇后放置的列;i的范围:0—n-1;(2)数据初始化(3)从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先用xx函数测试当前位置是未被占领;如果是,摆放第n-1个皇后后并宣布占领,接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n<=8,m=8时,却发现此时已经无法摆放时,便要进行回溯。
(4)当n=8时,便一一打印出结果。
)首先定义一个递归找全部的解的递归函数FindQueen(int i),设有一个参数i,表示1至i-1行都已有皇后合理放置的情况下,寻找第i行的合理放置。
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年提出的。
福建工程学院课程设计课程:VC++面向对象程序设计题目:皇后问题专业:电子科学与技术班级:0902座号:20**:***2012年3月15日一、实践目的与要求:①要求在一个n×n 的棋盘上放置n个皇后,要求放置的n个皇后不会互相吃掉对方;皇后棋子可以吃掉任何它所在的那一行、那一列,以及那两条对角线上的任何棋子。
②熟悉visual C++编程环境二、实践工具与准备在开始实验前,应回顾或复习相关内容。
需要一台计算机,其中安装有Visual C++ 6 .0集成开发环境软件。
课题分析三、课题分析八皇后问题是一个古老而著名的问题,它是回溯算法的典型例题。
该问题是十九世纪德国著名数学家高斯于1850年提出的:在8行8列的国际象棋棋盘上摆放着八个皇后。
使他们之间不能互相攻击。
若两个皇后位于同一行、同一列或同一对角线上,则它们之间就可以互相攻击。
后来人们从8皇后问题延伸到了n皇后问题,问题的重点即使每两个皇后都不能在同一行、同一列、同一对角线上。
在分析这个问题时,我们不妨从第一列开始放置皇后。
这里我们选择使用回溯法即经典的递归法来求解n皇后问题,这个算法将在棋盘上一列一列地放置皇后直到n个皇后在不相互攻击的情况下都被摆放在棋盘上,算法便终止。
当一个新加入的皇后因为与已经存在的皇后之间相互攻击而不能被摆在棋盘上时,算法便发生回溯。
一旦发生这种情况,就试图把最后放在棋盘上的皇后移动到其他地方。
这样做是为了让新加入的皇后能够在不与其它皇后相互攻击的情况下被摆放在棋盘的适当位置上。
如图所示是两种满足要求摆放皇后的图。
四、设计流程①打开visual C++新建一个MFC APPwizrd(exe) 工程,由于该n皇后问题是由8皇后问题衍变而来的,我们为了纪念高斯这位伟大的数学家,我们把工程命名为EightQueen。
②按如图为窗体放置相应的组件,将窗体的名称改成“皇后问题”并按以下表格设置好相关的ID和属性③标题ID 属性分组框开始IDC_START暂停/单步IDC_PAUSEn值IDC_BOARD_SIZE单步IDC_STEP_BY不中断IDC_NO_INT继续IDC_CONTINUE停止IDC_STOPQueen_panel IDC_QUEEN_PANEL关于IDC_ABOUT按Ctrl+W为IDC_QUEEN_PANEL添加一个Type为QueenPanel的成员变量m_panel④为组件画板新建一个名为QueenPanel的类,并添加以下成员:public privateQueenPanel(); void DrawBoard(CDC *pDC, int size, int cell); QueenPanel(int size); int *queen;virtual ~QueenPanel(); int n;void SetSize(int size); HANDLE queen_mutex;void SetQueen(int *newq);void SetQueen(int row, int col)④为CEightQueenDlg类添加以下变量及函数五、程序代码:①为单步单选框控件添加BN_CLICKED消息映射,代码如下:CButton *step = (CButton *)GetDlgItem(IDC_STEP_BY);m_step = (step->GetCheck()==BST_CHECKED)?TRUE:FALSE;if(m_step) {CButton *autoBtn = (CButton *)GetDlgItem(IDC_NO_INT);autoBtn->SetCheck(FALSE);m_no_int = FALSE;}②为不中断单选框控件添加BN_CLICKED消息映射,代码如下:CButton *autoBtn = (CButton *)GetDlgItem(IDC_NO_INT);m_no_int = (autoBtn->GetCheck()==BST_CHECKED)?TRUE:FALSE;if(m_no_int) {CButton *step = (CButton *)GetDlgItem(IDC_STEP_BY);step->SetCheck(FALSE);m_step = FALSE;}③为开始按钮控件添加BN_CLICKED消息映射,代码如下:DWORD dwThreadId;HANDLE hThread;CString str;GetDlgItem(IDC_BOARD_SIZE)->GetWindowText(str);int newn = atoi(str);if(newn<=3) {MessageBox("大小不能小于4", "警告", MB_OK);return;}else {n = newn;}m_panel.SetSize(n);step = m_step;no_int = m_no_int;running = TRUE;pausing = canceling = FALSE;UpdateUI();hThread = CreateThread(NULL,0,ThreadGo,this,0,&dwThreadId);if (hThread == NULL){MessageBox( NULL, "CreateThread failed.", MB_OK );}}DWORD WINAPI CEightQueenDlg::ThreadGo( LPVOID lpParam ){CEightQueenDlg *dlg = (CEightQueenDlg *)lpParam;dlg->Go();return 0;④为暂停/单步按钮控件添加BN_CLICKED消息映射,代码如下:WaitForSingleObject(this_mutex,INFINITE);step = TRUE;if(pausing) {SetEvent(pause_event);}ReleaseMutex(this_mutex);UpdateUI();⑤为继续按钮控件添加BN_CLICKED消息映射,代码如下WaitForSingleObject(this_mutex,INFINITE);step = FALSE;if(pausing) {SetEvent(pause_event);}ReleaseMutex(this_mutex);UpdateUI();⑥为停止按钮控件添加BN_CLICKED消息映射,代码如下WaitForSingleObject(this_mutex, INFINITE);step = FALSE;canceling = TRUE;if(pausing) {SetEvent(pause_event);}ReleaseMutex(this_mutex);UpdateUI();⑦为QueenPanel.cpp添加如下代码QueenPanel::QueenPanel(){this->queen = NULL;n = 0;queen_mutex = CreateMutex(NULL,FALSE,NULL);}QueenPanel::QueenPanel(int size){this->queen = NULL;n = 0;SetSize(size);queen_mutex = CreateMutex(NULL,FALSE,NULL);}QueenPanel::~QueenPanel()//析构函数,释放空间{if(queen!=NULL)free(queen);}BEGIN_MESSAGE_MAP(QueenPanel, CWnd)//{{AFX_MSG_MAP(QueenPanel)ON_WM_PAINT()//}}AFX_MSG_MAPEND_MESSAGE_MAP()QueenPanel message handlersvoid QueenPanel::OnPaint(){CPaintDC dc(this); // device context for paintingif (n == 0 || queen == NULL) {return;}RECT rect;GetWindowRect(&rect);CDC MemDC; //定义一个显示设备对象CBitmap MemBitmap;//定义一个位图对象WaitForSingleObject(queen_mutex, INFINITE);int w = rect.right-rect.left;int h = rect.bottom -rect.top;int board = w >= h ? h : w;board = board - board % n;int cell = board / n;//System.out.println("w:" + w + " h:" + h + " x: " + x + " y:" + y + " cell:" + // cell + " board:" + board + " rl:" + rl);int count = 0;int i;CPen b_pen(PS_SOLID, 1, RGB(0, 0, 255));CPen r_pen(PS_SOLID, 1, RGB(255, 0, 0));CBrush y_brush, b_brush;y_brush.CreateSolidBrush(RGB(255, 255, 0));b_brush.CreateSolidBrush(RGB(255, 255, 255));MemDC.CreateCompatibleDC(&dc); //建立兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(&dc,w, h);//建立一个兼容的位图CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);MemDC.FillRect(CRect(0, 0, w, h), &b_brush);if(cell<7) {MemDC.TextOut(0, h/2, "太大,画不下了!");}else {DrawBoard(&MemDC, n, cell);MemDC.SelectObject(b_pen);MemDC.SelectObject(y_brush);for (i = 0; i < n; i++) {if (queen[i] >= 0) {MemDC.Ellipse(queen[i] * cell + cell / 6, i * cell + cell / 6,queen[i] * cell + cell / 6+cell * 2 / 3,i * cell + cell / 6+cell * 2 / 3);count++;}}}ReleaseMutex(queen_mutex);dc.BitBlt(0,0,w, h,&MemDC,0,0,SRCCOPY);}void QueenPanel::DrawBoard(CDC *pDC, int size, int cell) {int i, j;CBrush w_brush, b_brush;b_brush.CreateSolidBrush(RGB(0, 0, 0));w_brush.CreateSolidBrush(RGB(255, 255, 255));for(i=0; i<size; i++) {for(j=0; j<size; j++) {if((i+j)%2 ==0 ) {pDC->FillRect(CRect(i*cell, j*cell, (i+1)*cell -1, (j+1)*cell-1), &b_brush);}else {pDC->FillRect(CRect(i*cell, j*cell, (i+1)*cell -1, (j+1)*cell-1), &w_brush);}}}CPen b_pen(PS_SOLID, 1, RGB(0, 0, 0));int board = cell*size;pDC->SelectObject(b_pen);pDC->MoveTo(0, 0);pDC->LineTo(0, board-1);pDC->LineTo(board-1, board-1);pDC->LineTo(board-1, 0);pDC->LineTo(0, 0);}void QueenPanel::SetSize(int size) {WaitForSingleObject(queen_mutex,INFINITE);if(size>n) {if(queen!=NULL)free(queen);queen = (int *)malloc(size*sizeof(int));for(int i=0;i<size;i++)queen[i] = -1;}n = size;ReleaseMutex(queen_mutex);RedrawWindow();}void QueenPanel::SetQueen(int *newq){WaitForSingleObject(queen_mutex,INFINITE);int i;for (i = 0; i < n; i++) {queen[i] = newq[i];}ReleaseMutex(queen_mutex);RedrawWindow();}void QueenPanel::SetQueen(int row, int col){WaitForSingleObject(queen_mutex,INFINITE);queen[row] = col;ReleaseMutex(queen_mutex);RedrawWindow();}⑧在CEightQueenDlg.cpp中的顶部添加如下代码#include "QueenPanel.h"将QueenPanel.h包含进来六、测试与结论七、设计过程遇到的问题、思考及解决方法本程序主要的重点是主要是为“开始”组建添加的子程序,还有对“画板”组建类的定义和实现。
八皇后c 课程设计一、课程目标知识目标:1. 学生能理解“八皇后”问题的背景和数学原理,掌握其基本的算法概念。
2. 学生能运用编程思维,掌握至少一种解决“八皇后”问题的算法,并能够解释其原理。
3. 学生理解并能够运用递归思想解决“八皇后”问题,理解递归算法在问题解决中的应用。
技能目标:1. 学生能够通过实践操作,编写出解决“八皇后”问题的程序,并能够调试优化。
2. 学生通过小组合作,提升团队协作和问题讨论的能力,学会在团队中分工和协调。
3. 学生能够运用逻辑思维和批判性思维,评价和比较不同的算法,选择最优解决方案。
情感态度价值观目标:1. 学生通过解决“八皇后”问题,培养对计算机科学和算法的兴趣,增强学习信息技术的热情。
2. 学生在学习过程中,能够培养面对困难的坚持和耐心,体会解决问题的快乐和成就感。
3. 学生能够在团队协作中学会相互尊重和倾听,培养积极向上的团队精神和集体荣誉感。
课程性质分析:本课程属于信息技术学科,结合数学逻辑思维,强调理论与实践的结合,注重培养学生的逻辑思维和编程能力。
学生特点分析:八年级学生对信息技术已有初步了解,具有一定的逻辑思维能力和问题解决能力,对新鲜事物充满好奇,但编程实践经验不足,需要通过具体案例来提升技能。
教学要求:教学应结合学生特点,注重启发式教学,引导学生主动探究,鼓励创新思维,并通过实际编程操作巩固知识,提升技能。
同时,注重情感态度的培养,激发学生的学习兴趣和内在动力。
二、教学内容本课程以“八皇后”问题为载体,结合以下教学内容:1. “八皇后”问题背景介绍:包括问题的起源、发展历程及其在计算机科学中的地位。
- 相关章节:教材第二章第二节2. 算法原理讲解:重点讲解回溯法、递归法等解决“八皇后”问题的基本算法原理。
- 相关章节:教材第三章3. 编程语言基础:运用Python等编程语言进行算法实现,涵盖基本的编程语法和数据结构。
- 相关章节:教材第四章4. 编程实践:a. 编写“八皇后”问题的求解程序,实现算法的实际应用。
n皇后课程设计一、课程目标知识目标:1. 学生能理解“n皇后”问题的背景,掌握其基本的数学原理。
2. 学生能运用计算机编程语言实现“n皇后”问题的算法。
3. 学生理解并掌握解决“n皇后”问题所需的基础逻辑思维和问题分解技巧。
技能目标:1. 学生通过解决“n皇后”问题,培养算法思维和问题解决能力。
2. 学生能运用所学知识,编写简单的程序代码,实现问题求解。
3. 学生通过小组合作,提高团队协作和沟通能力。
情感态度价值观目标:1. 学生培养对计算机科学和数学问题的兴趣,增强对复杂问题探究的积极性。
2. 学生在解决问题的过程中,学会坚持和克服困难,培养面对挫折的积极态度。
3. 学生通过学习“n皇后”问题,认识到数学和计算机科学在实际生活中的应用价值。
课程性质分析:本课程以计算机科学和数学知识为基础,结合实际问题,旨在提高学生的逻辑思维和问题解决能力。
学生特点分析:考虑到学生所在年级的特点,他们已具备一定的数学基础和初步的编程能力,能够理解并应用更高级的算法。
教学要求:1. 结合学生实际水平,引导他们自主探究“n皇后”问题。
2. 通过案例教学,使学生在实践中掌握知识。
3. 注重培养学生的团队协作和沟通能力,提高其综合素质。
二、教学内容1. “n皇后”问题背景介绍:包括问题的起源、在数学和计算机科学中的地位及应用。
2. 数学基础知识:回顾排列组合、逻辑推理等基本概念,为“n皇后”问题解决打下基础。
3. 算法原理:介绍回溯算法、递归算法等基本算法原理,并分析它们在“n皇后”问题中的应用。
4. 编程实践:结合教材章节,使用Python或C++等编程语言实现“n皇后”问题的算法。
- 程序设计基础:数据结构、函数定义、循环与判断等。
- 编程技巧:如何编写简洁、高效的代码,以及调试方法。
5. 问题分解与逻辑思维训练:通过“n皇后”问题,培养学生的问题分解能力和逻辑思维能力。
6. 小组合作与展示:分组讨论、实践编程,最后进行成果展示和交流。
经济管理学院本科课程设计论文数据结构课程设计学号: 1005170222 姓名:孙海龙班级:管理102 专业:信息管理与信息系统系别: 管理系指导教师:孙鸿飞2011 年 12 月 30日吉林目录第一章八皇后问题概述........................................... - 1 -1.1 课题的描述............................................... - 1 -1.2 需求分析................................................. - 1 -1.2.1 涉及到的知识 ...................................... - 1 -1.2.2 模块的功能要求.................................... - 1 -1.2.3 软硬件的需求 ...................................... - 2 -1.2.4 面对的问题......................................... - 2 -1.3 概要设计................................................. - 2 -1.3.1 结构设计理念 ...................................... - 2 -1.3.2 算法流程图......................................... - 3 -1.4详细设计和实现........................................... - 4 -1.5 程序调试................................................. - 6 -1.5.1 问题思考及改进设想................................ - 6 -1.5.2运行与测试......................................... - 7 -1.6 课设总结................................................. - 9 - 第二章 n阶魔阵问题概述........................................ - 10 -2.1课题的描述 .............................................. - 10 -2.2 需求分析................................................ - 10 -2.2.1 涉及到的知识 ..................................... - 10 -2.2.2 模块的功能需求................................... - 10 -2.2.3 软硬件的需求 ..................................... - 10 -2.2.4 面对的问题........................................ - 10 -2.3 概要设计................................................ - 11 -2.3.1算法设计理念...................................... - 11 -2.3.2 函数逻辑功能调用图............................... - 11 -2.3.3 算法流程图........................................ - 12 -2.4详细设计和实现.......................................... - 12 -2.4.1代码编写及详细设置............................... - 12 -2.5 程序调试................................................ - 15 -2.5.1 问题思考及改进设想............................... - 15 -2.5.2 运行与测试........................................ - 15 -2.6 课设总结................................................ - 18 - 参考文献......................................................... - 19 - 结束语........................................................... - 20 - 附录........................................................... - 21 -第1章八皇后问题概述第一章八皇后问题概述1.1 课题的描述八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。
八皇后问题是在8*8的国际象棋棋盘上,安放8皇后,要求没有一个皇后能够“吃掉”任何其他一个皇后,即没有两个或两个以上的皇后占据棋盘上的同一行、同一列、或同一对角线。
到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。
运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。
1.2 需求分析1.2.1 涉及到的知识本次课程设计中,用到的主要知识有:递归法的运用,for语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的有关知识的掌握。
要求熟练运用C++语言、基本算法的基础知识,独立编制一个具有中等难度的、解决实际应用问题的应用程序。
通过对题意的分析与计算,用递归法回溯法及枚举法解决八皇后是比较适合的。
递归是一种比较简单的且比较古老的算法。
回溯法是递归法的升华,在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。
而枚举法,更是一种基础易懂简洁的方法。
把它们综合起来,就构成了今天的算法。
不论用什么法做这个课题,重要的就是先搞清楚哪个位置是合法的放皇后的位置,哪个不能,要先判断,后放置。
1.2.2 模块的功能要求当运行程序时,在屏幕上显示每一种方法八个皇后的相对位置,要用比较直观的界面显示。
列:规定每一列放一个皇后,不会造成列上的冲突;行:当第I行被某个皇后占领后,则同一行所不能再放皇后,要把以I为下标的经济管理学院本科课程设计论文标记置为被占领状态;对角线:对角线有两个方向。
在这我把这两条对角线称为:主对角线和从对角线。
在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。
因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。
用数组a[I]:a [I]表示第I个皇后放置的列;I的范围:1-8;对角线数组:b[j](主对角线),c[j](从对角线),根据程序的运行,去决定主从对角线是否放入皇后。
1.2.3 软硬件的需求(1)系统要求:win98以上操作系统;(2)语言平台:tc++或vc++6.0;1.2.4 面对的问题(1)列:规定每一列放一个皇后,不会造成列上的冲突;行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;对角线:对角线有两个方向。
在这我把这两条对角线称为:主对角线和从对角线。
在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。
因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。
(2)使用数据结构的知识,用递归法解决问:。
数组a[I]:a [I]表示第I个皇后放置的列;I的范围:1..8;对角线数组:b[j](主对角线),c[j](从对角线),根据程序的运行,去决定主从对角线是否放入皇后;1.3 概要设计1.3.1 结构设计理念(1)从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领)。
如果是,摆放第n个皇后,并宣布占领,接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n<=8,m=8时,发现此时已无法摆放时,便要进行回溯。
从问题的某一种可能出发,搜索从这种情况能出发,继续搜索,这种不断“回溯”的寻找解的方法,称为“回溯法”。
(2)使用数组实现回溯法的思想。
(3)当n>8时,便打印出结果。
第1章八皇后问题概述1.3.2 算法流程图图1-1 算法流程图经济管理学院本科课程设计论文序图1-11.4详细设计和实现#include <conio.h>#include <math.h>#include <stdlib.h>#include <stdio.h>#include <iostream.h>#define QUEENS 8int iCount = 0; //!记录解的序号的全局变量。
int Site[QUEENS]; //!记录皇后在各行上的放置位置的全局数组。
void Queen(int n); //!递归求解的函数。
void Output();//!输出一个解。
int IsValid(int n);第1章八皇后问题概述//!判断第n个皇后放上去之后,是否有〉冲突。
void main() /*----------------------------Main:主函数。
----------------------------*/{ system("title 管理102孙海龙八皇后问题 ");cout<<" "<<"八皇后问题:"<<endl;cout<<" "<<"-------------------------------------"<<endl; Queen(0); //!从第0行开始递归试探。