八皇后问题 学
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 算法设计
利用计算机运行速度快的特点,采用枚举法,逐一尝试各种摆放方式,来判断最
终摆法。 其中判断是否同在对角线上用到了: 行数差的绝对值与列数差的绝对值相等,
来简化问题的判断。以a,b,c,d,e,f,g,h 的值表示皇后在第一,二,三,四,五,六,七,八
行对应的列数就很好的解决了行列的问题。
我的想法:,只是要能根据输入的位置进行程序。我使用了switch 选择结构语句,j
表示行数,k 表示列数,当j 为一时即皇后在第一行,然后再看a 与k 是否相等,当a 不等
于k 时,则continue,跳出本次循环,知道a 等于k 时。
其中函数大致分为三大模块:
1、排列出一种八皇后排列方法
2、 用swich 判断是否有一个位置与输入的相同
3、若满足,输出皇后列数,即a,b,c,d,e,f,g,h.
三、详细设计和编码
#include
#include
#include
int main()
{
int a, b, c, d, e, f, g, h; //定义每行所放皇后位置的列数
int x, y; //定义输入皇后的行数及列数
printf("input position");
scanf("%d", &x);
scanf("%d", &y);
//开始确定能摆放八个皇后的摆法
for(a 1;a< 8;++a)