VC++程序设计 八皇后设计报告
关于c语言编程中八皇后问题的设计报告

关于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语言课程设计

八皇后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语言编程基础,并能将其应用于解决实际问题。
算法设计与分析实验报告—八皇后问题

算法设计与分析实验报告—八皇后问题-姓名:***学号:********班级:软件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语言程序设计

八皇后问题学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 算法设计利用计算机运行速度快的特点,采用枚举法,逐一尝试各种摆放方式,来判断最终摆法。
c语言八皇后问题程序设计

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个棋子摆在棋盘上,每行摆一个,然后去检查这种摆放是否有冲突,如果没有冲突,即找到了一种解决方案。
八皇后实验报告

前一行去,即回溯
}}A[i]=0; i--;//行数减一
if(i>=0) A[i]++;}//向后挪一个把前一行的皇后
return0;}运行结果:
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 true;}int main(){int n,i,A[max],s=1;
返回后的处理:
返回一个bool型的变量,若true,则下一个进入方阵的皇后可以放在这, 反之,则不能;
返回值(如果有的话):
true or false
函数的输入参数:无函数的输出参数:无*/
#include "iostream"
#define max100
using namespace std;
bБайду номын сангаасol unguarded(int A[],int m){int n;
独立
2.关于类的说明:
类名称:无定义该类的目的:
类属性:
类中函数及功能:
与其他类的关系(调用/被调用哪类对象中的什么函数):
3.关于函数的说明
(1)函数名称:
bool unguarded(int A[],int m)
函数功能描述:
检查A[]-1列和第m-1的皇后是否设防
函数调用之前的预备条件:
一位数组和整数m
八皇后问题实验报告

软件工程上机报告实验名称:八皇后问题图形界面求解姓名:郭恂学号:2011011435班级:11级数学班中国石油大学(北京)计算机科学与技术系一、试验程序截图:点击显示下一组解即可显示下一组解:同样的,如果点击上一组解即可显示上一组解。
若在第1组解时点击显示上一组解会弹出报错提示框。
同样,若在第92组解点击显示下一组解也会弹出报错提示框:二、程序代码程序使用Java语言编写,编写环境为jdk1.6.0_18。
使用编程开发环境eclipse.exe编写。
本程序创建了两个类,两个类在同一个工程中。
其中Queen类的作用仅仅用来保存八皇后问题计算结果的数据,便于画图时使用。
本程序大概由两部分组成,第一部分是解八皇后问题,第二部分是画图。
程序源代码为:类1:public class Queen{public int[] x=new int[8];public int[] y=new int[8];public String name;}类2:import javax.swing.*;import java.awt.event.*;import java.awt.*;import javax.swing.JOptionPane;public class bahuanghou extends JFrame implements ActionListener {//JLabel[] l;int number=0; //当前显示的解的编号int sum=0; //所有解得数量JLabel l2;JButton b1,b2; //b1为显示下一组解得按钮,b2为显示上一组解得按钮。
Queen[] q=new Queen[128]; //得到的解储存在Queen类的数组里面。
private Image bomb1=Toolkit.getDefaultToolkit().getImage("D:\\qizi1.JPG"); //黑格棋子为bomb1private Image bomb2=Toolkit.getDefaultToolkit().getImage("D:\\qizi2.JPG"); //白格棋子为bomb2public bahuanghou() //构造方法,初始化窗口。
C语言程序设计 数组(8.3.12)--八皇后问题

其中,rowPos[i]表示第 i 行上皇后的位置(即位于第 i 行的第几列),col[j]表示第 j 列上没 有皇后占据,leftDiag[k]表示第 k 条左对角线(↙)上没有皇后占据,rightDiag[k]表示第 k 条右对角线(↘)上没有皇后占据。
4. 八皇后问题
【任务描述】八皇后问题是 1850 年由数学家 Gauss 首先提出的。问题是这样的:在一个 8×8 的国际象棋棋盘上放置 8 个皇后,要求每个皇后两两之间不“冲突”,即没有一个皇 后能“吃掉”任何其他一个皇后。简单地说,就是没有任何两个皇后占据棋盘上的同一行或 同一列或同一对角线,即在每一横行、竖列、斜线上都只有一个皇后。
在该位置放置皇后; if (i < 7) {
尝试第 i+1 种摆法; if (不成功)
移走该位置上的皇后; } else
置标志变量为成功; } } while (不成功 && 位置未试完); return 标志变量记录的成功与否信息; }
由于对角线有两个方向,在同一对角线上的所有点(设其坐标为(i, j)),要么行、列坐 标之和 i+j 是常数,要么行、列坐标之差 ij 是常数。其中,行、列坐标之和(在 0~14 范围 内)相等的诸方格在同一条(↙)对角线上,而行、列坐标之差(在7~7 范围内)相等 的诸方格在同一条↘对角线上。因此,可用 b[i+j]的值表示位置为(i, j)的(↙)对角线上是 否有皇后占据(若无皇后占据,则置 b[i+j]为真,否则置 b[i+j]为假),用 c[ij+7]表示位置 为(i, j)的(↘)对角线上是否有皇后占据(若 无皇后占据,则置 c[ij+7]为真,否则置 c[ij+7]为假)。如果 col[j],leftDiag[i+j]和 rightDiag[ij+7]都为真,则说明位置(i, j)是安全
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四、问题及解决方案(设计过程中碰到的问题及最后的解决方案)
问题:1、如何建立棋盘以及确定棋盘的大小?
2、采用什么方法去实现皇后图标的放置?
3、如何使用一维数组去定义棋盘的每一个棋格的位置?
4、如何判断放置的皇后放置的位置是否合理?
/jillzhang/archive/2007/10/21/922830.html
递归算法学习系列之八皇后问题
C/C++程序设计教程:Visual C++环境/龚沛曾,杨志强主编
C++面向对象程序设计[专著]/邵兰洁主编.—北京:清华大学出版社,2015.2
5、如何确定游戏完成?
解决方法:
1、先大概量取界面尺寸,让后根据界面大小和棋盘要求将棋盘设计成360X360pp大小。最后将其划分8X8的棋盘。
2、采用先建立皇后图标,然后在Ondraw中遍历皇后数组的值判断是否要绘制皇后。
3、长度为8个int的一维数组EightQueen[8],它的每一个数值代表一个棋子,它的序号i代表棋盘中的行,它的数值EightQueen[i]代表棋盘中的列。
4、先取得点击棋盘的位置坐标。然后依次判断与已经放置的皇后位置是否在同一行和同一列,以及这两个坐标是否在同一条斜线上。
5、判断是否放置了八个皇后。
五、设计成果(所完成程序的界面截图,使用和操作方法的简要说明)
打开游戏界面:
获取游戏帮助:点击帮助,会出现一个界面,上面有游戏说明和游戏规则以及游戏操作方法。
游戏过程:单击任意位置左键放置皇后,右键取消放置。
游戏放置位置不合法:此时放置的位置与已放置皇后位置冲突,会弹出提示界面。提示此处不能放置皇后。
游戏胜利:
重新开始:当你发现你已经不能再放置一个皇后了,你可以单击重新开始,使得棋盘回到初始状态。
查看部分结果:当你不不知道如何进行下个皇后的放置时,你可以单击查看部分结果。它会根据已经放置情况生成所有可能的解,并弹出一个对话框来提示你。
课程设计总结报告
学号:姓名:王██课程名称:Visual C++程序设计
教学班级:电子邮箱:联系电话:
课程设计题目
八皇后
自选题目否
小组负责人
莫██
小组成员
莫██、曾██、王██、童██
本人承担任务பைடு நூலகம்
1棋盘棋子设计,2实现重新开始,帮助,查看结果的功能
一、设计目标(所做的设计所要达到的目标):
做一个关于八皇后的游戏界面,在一个8*8的矩阵国际棋盘上面放置8个物体(即我们所说的皇后),一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。
在放入第一个物体后,我们每一次再放入下一物体在另外的一个格子当中时,也就是鼠标左键单击那个格子时,屏幕要显示那个格子是否能放入物体,即是否符合我们八皇后的规则。然后玩家可以大家右键取消物体的安放。
二、设计方案(达到设计目标的构思和采取的方案):
(1)首先我们建立一个0~7的一维数组
(2)在第n行寻找可以插入的位置,中间涉及到位置合法性的判断
六、设计总结(通过课程设计掌握的知识和方法,以及你的感想)
附件:(仅供参考,并不会把整个源文件发上来)
查看部分结果对话框界面:根据已放置皇后位置生成所有可能的解会在弹出界面的右边以数字的形式显示出来,每一列数字都代表一个相应的解。从左到右一共有八个数字,每一个数字带便所在列数皇后位置0~7。双击其中的一个解,会在左边的界面显示出解的图示情况,使得玩家更加直观的知道解的情况。对话框下方还会显示匹配结果的个数。
(3)如果是不符合的位置,显示提示,。然后让玩家取消位置摆放,进行下一次选择。
(4)如果摆放完毕,则显示游戏结束。
三、参考资料(完成设计过程中所参考的书面或网络资料)
/feixiaoxing/article/details/6877965
一步一步写算法(之八皇后)