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次将数填入,若遇到下列两种情况之一,则填写位置按以下规则调整。
经济管理学院本科课程设计论文数据结构课程设计学号: 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行开始递归试探。