四皇后实验报告推荐word版 11页Word格式.docx

上传人:b****2 文档编号:12939396 上传时间:2022-09-30 格式:DOCX 页数:10 大小:16.25KB
下载 相关 举报
四皇后实验报告推荐word版 11页Word格式.docx_第1页
第1页 / 共10页
四皇后实验报告推荐word版 11页Word格式.docx_第2页
第2页 / 共10页
四皇后实验报告推荐word版 11页Word格式.docx_第3页
第3页 / 共10页
四皇后实验报告推荐word版 11页Word格式.docx_第4页
第4页 / 共10页
四皇后实验报告推荐word版 11页Word格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

四皇后实验报告推荐word版 11页Word格式.docx

《四皇后实验报告推荐word版 11页Word格式.docx》由会员分享,可在线阅读,更多相关《四皇后实验报告推荐word版 11页Word格式.docx(10页珍藏版)》请在冰豆网上搜索。

四皇后实验报告推荐word版 11页Word格式.docx

比如第一行:

R11,R12,R13,R14

②棋盘中共有四行,所以共有16条规则。

即:

R11,R12,R13,R14

R21,R22,R23,R24

R31,R32,R33,R34

R41,R42,R43,R44

③16条规则中,哪些是当前可用规则,取决于DATA的长度,即:

DATA中的元素个数。

换言之,每次只能将一个棋子放在当前行的下一行。

二、回溯法搜索策略图

讨论:

上述算法产生22次回溯,原因在于规则自然顺序排列,没考虑任何智能因素。

改进算法

定义对角线函数:

diag(i,j):

过ij点最长的对角线长度值。

规定:

①如果:

diag(i,k)≤diag(i,j)则规则排列次序为:

Rik,Rij同一行四条规则中,对角线函数值小的排在前面

②如果:

diag(i,k)=diag(i,j)则规则排列次序为:

Rij,Rikj<k对角线长度相等的规则按照字母排列顺序排序

①利用局部知识排列规则是有效的。

②BACKTRACK算法对重复出现的状态没有判断,所以可能造成出现死循环。

③没有对搜索深度加以限制,可能造成搜索代价太大。

三、算法描述回溯法——在约束条件下先序遍历,并在遍历过程中剪去那些不满足条件的分支。

使用回溯算法求解的问题特征,求解问题要分为若干步,且每一步都有几种可能的选择,而且往往在某个选择不成功时需要回头再试另外一种选择,如果到达求解目标则每一步的选择构成了问题的解,如果回头到第一步且没有新的选择则问题求解失败。

在回溯策略中,也可以通过引入一些与问题相关的信息来加快搜索解的速度。

对于皇后问题来说,由于每一行、每一列和每一个对角线,都只能放一个皇后,当一个皇后放到棋盘上后,不管它放在棋盘的什么位置,它所影响的行和列方向上的棋盘位置是固定的,因此在行、列方面没有什么信息可以利用。

但在不同的位置,在对角线方向所影响的棋盘位置数则是不同的。

可以想象,如果把一个皇后放在棋盘的某个位置后,它所影响的棋盘位置数少,那么给以后放皇后留下的余地就太大,找到解的可能性也大;

反之留有余地就小,找到解的可能性也小。

四、算法流程图

五、源程序

#include<

stdio.h>

#defineN4

charboard[N][N];

intt;

intcol[N];

//存储第i行对应的列的值,这样的(i,j)值满足当前棋盘上的皇后不能互相攻击。

intsafetyPlace(intx,inty)//(x,y)位置是否安全

{

inti,j;

for(i=0;

i<

x;

i++)

j=col[i];

if(x==i||y==j)

return0;

if(x-y==i-j||x+y==i+j)//判断左右对角线

}

return1;

voidget_position(inti)//处在第i行时状态

intw,j;

chara[1]={3};

if(i==N)//输出棋盘

for(w=0;

w<

N;

w++)

for(j=0;

j<

j++)

if(board[w][j]==001)

printf("

%c"

board[w][j]);

else

%c"

a[0])

;

\n"

);

--------------\n"

t++;

{intu;

for(u=0;

u<

u++)

{if(safetyPlace(i,u)==1)

col[i]=u;

//记录下第i行可行的列的位置board[i][u]=001;

//放置皇后

get_position(i+1);

//转换到下一个状态,即下一行

col[i]=0;

//回溯到当前状态,重置列和棋盘的值board[i][u]=0;

}}

main()

%c是皇后!

\n\n"

001);

get_position(0);

一共有%d种方法!

t);

六、结果截图

篇二:

八皇后问题实验报告

实验报告

——八皇后问题求解(递归和非递归)

学号:

专业年级:

姓名:

一、需求分析(要实现的功能描述)

1.问题描述

八皇后问题是一个以国际象棋为背景的问题:

如何能够在8×

8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?

为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

八皇后问题可以推广为更一般的n皇后摆放问题:

这时棋盘的大小变为n×

n,而皇后个数也变成n。

当且仅当n=1或n≥4时问题有解。

八皇后问题最早是由国际囯际象棋棋手马克斯·

贝瑟尔于1848年提出。

诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。

2.实现功能

八皇后问题实现了在棋盘上摆放八个皇后的功能,这八个皇后任意两个皇后都不能处于同一条横行、纵行或斜线上。

3.测试数据

测试数据可以通过手工寻找三组满足需要的值,测试数组(M,N),其中M代表皇后所在的行,N代表皇后所在的列。

例如,第一组测试数据:

(1,4)、(2,7)、(3,3)、(4、8)、(5,2)、(6,5)、(7,1)、(8,6);

第二组测试数据(1,5)、(2,2)、(3,4)、(4,7)、(5,3)、(6,8)、(7,6)、(8,1);

第三组测试数据:

(1,4)、(2,2)、(3,7)、(4,3)、(5,6)、(6,8)、(7,5)、(8,1)。

最后与编程求得的结果进行比较。

如果这三组数据在最后编程求得的结果中,说明程序的编写基本没有什么问题。

二、概要设计

在进行概要设计的过程中,要清楚整个程序包含的功能模块及模块间的调用关系。

对于八皇后问题,整个程序中应该包括主函数模块,摆放皇后的函数模块,以及判断皇后的位置是否摆放正确的判断模块。

对于模块间的关系,在运行主函数的过程中会调用摆放皇后的函数模块,在摆放皇后的函数模块中,又会调用判断皇后位置是否摆放正确的判断模块。

三、详细设计

抽象数据类型中定义的各种操作算法实现(用N-S图描述)对于求解八皇后问题的非递归算法,N-S图如下:

对于八皇后问题求解的递归算法,N-S图如下:

四、调试分析

1.程序在调式过程中出现的问题及解决方法

由于对于C语言编程问题掌握的并非十分熟练,因而在程序的调试过程中出现了一些问题。

例如,在编写位置冲突算法的过程中,在解决对角线问题上,没有考虑对角线有两条,只考虑了其中的一条,因而在编写程序的过程中,没有使用绝对值,导致得到的满足要求的测试结果比实际的要多得多。

再如,为了能够输出比较整齐的测试结果,开始的时候只是输出了皇后所在的列数,没有输出皇后的行数。

后来,在添加了行数坐标后,两个程序输出了相同的比较整齐美观的测试结果。

2.算法的时间复杂度分析

在考虑算法的时间复杂度问题上,只需考虑每个函数的最大的时间复杂度即可,求得的最大的时间复杂度即为整个程序的时间复杂度。

对于递归程序的时间复杂度:

O(?

?

对于非递归程序的时间复杂度:

因而,对于递归和非递归程序两个程序的时间复杂度,递归程序的时间复杂度要高。

五、用户手册

由于在程序编写的过程中,使用的环境为VisualC++6.0,因而在使用的过程中,最好使用VisualC++6.0,以免在程序运行错误。

本程序的操作过程十分简单,不需要操作者有C语言基础。

六、测试结果

通过对于问题的编程求解,共得到了92种结果。

从中任意选择三组数据进行测试。

数组的第一个数值为皇后所在的行,第二个值为皇后所在的列。

第一组测试数据:

(1,4)、(2,7)、(3,3)、(4、8)、(5,2)、(6,5)、(7,1)、(8,6)用图像形象表示为:

再如,第二组测试数据:

(1,5)、(2,2)、(3,4)、(4,7)、(5,3)、(6,8)、(7,6)、(8,1)

(1,4)、(2,2)、(3,7)、(4,3)、(5,6)、(6,8)、(7,5)、(8,1)

由于空间有限,所以92种测试结果用数组的形式表示如下:

篇三:

八皇后实验报告

实验项目:

1.实验目的:

通过求解皇后问题,熟悉深度优先搜索法DFS(回溯法(BacktrackingAlgorithms)技术。

2.实验内容:

由n2个方块排成n行n列的正方形称为n元棋盘。

如果两个皇后位于n元棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。

现要找出使棋盘上n个皇后互不攻击的布局。

编制程序解决上述问题,以n=6运行程序,输出结果。

3.程序简介:

将n个皇后放到一个n*n的方阵中,要求每个皇后不在同一行同一列及同一对角线,我的程序是先把每个皇后放在了第零列,然后再按行检查,不符合要求继续下一列,若已经到这一行的最后一列,还没找到符合要求的位置,则回到上一行。

4.算法设计介绍:

定义一个一维数组,数组的下标是皇后所在位置的行数,数组存的值是皇后所在位置的列数,现将A[0]-A[n-1]都赋成零,然后随着检查的进行,皇后的位置也在不断地变化,最后找到一个符合要求的方阵时,本质上就是一个存放整数的一维数组,数组的下标是行数,存放的值是列数。

5.困难及解答

我很久以前就听说过八皇后问题,没想到现在轮到自己编了,一开始还真是特别糊涂呢,后来老师上课把算法大概讲了一遍,就清楚很多了,要说问题,就是一开始纠结怎么存放皇后,我开始想用二维数组着,后来老师说用一维数组比较好做,我看了一下

老师的算法,就明白了大概,经过一段时间就编出来了

5.心得

我编程变得还是很少,天天下决心说以后多编,也没践行,心想着吧,不挂在嘴上了,努力!

6.程序清单

/*

//我真诚地保证:

//我独立完成了整个程序从分析、设计到编码的所有工作。

//如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中

//详细地列举我所遇到的问题,以及别人给我的提示。

//我的程序里中凡是引用到其他程序或文档之处,

//例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段,

//我都已经在程序的注释里很清楚地注明了引用的出处。

//我从未没抄袭过别人的程序,也没有盗用别人的程序,//不管是修改式的抄袭还是原封不动的抄袭。

//我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转

文件名称:

创建者:

创建时间:

201X.4

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1