马的遍历课程设计报告

攀枝花学院本科课程设计报告(论文)马的遍历问题求解

学生姓名:

学生学号:

院 (系) :

年级专业:

2014年 1 月

攀枝花学院本科学生课程设计任务书

注:任务书由指导教师填写。

摘要

马步遍历问题与骑士巡游(knight's tour)问题是指在有8×8方格的国际象棋棋盘上进行奇异的骑士"L型"(L-shaped)移动的问题。而骑士巡游问题实际是带有约束条件的马步遍历问题,因此在用程序求解的时候可以一并求解。中国象棋中马采用“日”字走法,对棋盘上马所在的结点,一步内到达的结点最多有八个,即假设马所在点的坐标为(i,j),那么其它八个结点的坐标为(i+1,j+2),(i+2,j+1),(i+2,j-1),(i+1,j-2),(i-1,j-2),(i-2,j-1),(i-2,j+1),(i-1,j+2)把这些点看作马所在点的邻接点,所以可以采用类似图的深度优先遍历,以马所在点为初始点对整个棋盘进行遍历。然后按遍历的顺序输出结点。

关键词:象棋,遍历,数组

目录

摘要 (Ⅰ)

1 概述 (1)

1.1 前言 (1)

1.1.1问题描述 (1)

1.1.2课程设计的目的 (1)

2 流程图 (2)

3 设计思路 (3)

4 数据结构设计 (4)

5 功能函数算法分析 (5)

5.1 计算一个点周围有几个点 (5)

5.2 寻找下一个方向函数 (5)

5.3栈的相关函数 (6)

5.4马的遍历函数 (7)

5.5主函数 (9)

5.6棋盘初始化函数 (10)

5.7标记初始化函数 (10)

结论 (11)

参考文献 (12)

附录A:程序代码 (13)

1 概述

1.1前言

1.1.1问题描述

根据中国象棋棋盘,对任一位置上放置的一个马,均能选择一个合适的路线,使得该棋子能按象棋的规则不重复地走过棋盘上的每一位置。

要求:

(1)依次输出所走过的各位置的坐标。

(2)最好能画出棋盘的图形形式,并在其上动态地标注行走过程。

(3)程序能方便地地移植到其它规格的棋盘上。

1.1.2课程设计的目的

使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。

1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。

2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

2流程图

攀枝花学院本科课程设计报告(论文)

3 设计思路

首先,中国象棋是10*9的棋盘,马的走法是“马走日”,忽略“蹩脚马”的情况。

其次,这个题目采用的是算法当中的深度优先算法和回溯法:在“走到”一个位置后要寻找下一个位置,如果发生“阻塞”的情况,就是后面走不通的情况,则向后回溯,重新寻找。在寻找下一步的时候,对周围的这几个点进行比较,从而分出优劣程度,即看它们周围可以走的点谁最少,然后就走那条可走路线最少的那条。经过这样的筛选后,就会为后面的路径寻找提供方便,从而减少回溯次数。

最后,本程序的棋盘和数组类似,因而采用数组进行存储,同时因为有回溯,所以采用栈的方法,并且为了最后打印方便,采用的是顺序栈的方法。同时还有八个方向的数组,和为栈设计的每个点周围的八个方向那些可以走的数组。

4 数据结构设计

同上面述,棋盘采用数组形式,并且这里的数组比棋盘的数组规模稍大,因为为了

判断的方便,这里在棋盘周围各加了两层“墙”。具体数据结构定义如下:

int chessboard[14][13]; //采用最大的中国象棋10*9制的

int CanPass[14][13][8]; //每个棋子的八个方向哪些可以走

typedef struct

{ //棋盘的八个方向

int x,y;

}direction;

direction dir[8]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; //八个方向

typedef struct

{ //栈的节点结构

int x,y; //走过位置

int di; //走向下一个方向

}pathnode;

typedef struct{

pathnode pa[90]; //栈的容量最大为90

int top; //栈顶

}path; //顺序栈

5 功能函数算法分析

5.1 计算一个点周围有几个点函数int Count(int x,int y)

该函数实现的功能是在遍历的过程当中计算一个点周围有几个方向可以走,从而为后面的筛选提供依据。

int Count(int x,int y)

{ //计算每个节点周围有几个方向可以走int count=0,i=0;

for(i=0;i<8;i++)

if(chess[x+1+dir[i].x][y+1+dir[i].y]==0)

count++;

return count;

}

5.2寻找下一个方向函数int Find_Direction(int x,int y)

该函数的功能是在走过一个点之后,寻找下一个适合的点,如果找到返回正常的方向值,否则返回-1。

int Find_Direction(int x,int y)

{ //寻找下一个方向int dire,min=9,count,d=9;

for(dire=0;dire<8;dire++)

{

if(chess[x+1+dir[dire].x][y+1+dir[dire].y]==0&&CanPass[x+1][y+1][dire]==0) {

count=Count(x+dir[dire].x,y+dir[dire].y);

if(min>count){

min=count;

d=dire;

}

}

}

if(d<9)

return d;

else

return -1;

}

5.3栈的相关函数

初始化栈:void Init_Path(path *p);p是用到得栈;

判断栈是否是空:int Empty(path p);p是栈,是空的话返回1,否则返回0,时间复杂度为;

压栈函数:int Push_Path(path *p,pathnode t,int v)p是栈,t是压进去的节点,v是棋盘,时间复杂度为;

出栈函数:int Pop_Path(path *p,pathnode *t)p是栈,t是拿出来的节点,时间复杂度为。

void Init_Path(path *p)

{//初始化栈

p->top=-1;

}

int Push_Path(path *p,pathnode t)

{ //压节点及其向下一位移动的方向入栈if(p->top>=89)

return -1;

else

{

p->top++;

p->pa[p->top].x=t.x;

p->pa[p->top].y=t.y;

p->pa[p->top].di=t.di;

return 1;

}

}

int Empty(path p)

{ //判断栈是否为空if(p.top<0) return 1;

else return 0;

}

int Pop_Path(path *p,pathnode *t)

{ //出栈if(Empty_Path(*p))

return -1;

else

{

t->x=p->pa[p->top].x;

t->y=p->pa[p->top].y;

t->di=p->pa[p->top--].di;

return 1;

}

}

5.4马的遍历函数:void Horse(int x,int y)

这是该算法的精华部分,x,y表示入口地点,v表示棋盘类型即中国象棋,这个函数主体是一个循环,循环里面始终是在找下一个点,如果找到就将该点进栈,找不到则退栈。直到发生栈为空时退栈或循环结束,前一种情况时会提示找不到路径(虽然不会发生,但是为逻辑严密性依然要如此),后一种情况则打印出走过的正确路径和走过之后的数组。

void Horse(int x,int y) //x,y表示出发位置

{ //马遍历函数

int num=1,t,i;

path p;

pathnode f;

Init_Path(&p);

for(num=1;num<=90;num++)

{

t=Find_Direction(x,y);

if(t!=-1)

{ //正常找到下一个方向的情况下chessboard[x+1][y+1]=num;

f.x=x;f.y=y;f.di=t;

Push_Path(&p,f);

x=x+dir[t].x;y=y+dir[t].y;

}

else if(num==64+26*v&&chessboard[x+1][y+1]==0)

{ //最后一次时t肯定是-1

chessboard[x+1][y+1]=num;

f.x=x;f.y=y;f.di=t;

Push_Path(&p,f,v);

}

else

{

if(Pop_Path(&p,&f)==-1)

{ //出栈且栈为空的情况

printf("无法为您找到一条适合的路径!\n");

exit(0);

}

num-=2; //返回前一个点

x=f.x;

y=f.y;

CanPath[x+1][y+1][f.di]=1; //遍历不成功,即这个方向不通

}

} //根据栈中信息打印马的行走路径printf("马的遍历路径如下:\n ");

for(i=0;i<90;i++)

{

printf("(%2d,%2d)->",p.pa[i].x,p.pa[i].y);

if((i+1)%(8)==0)

printf("\b\b \n->");

}

}

5.5主函数:int main()

提示输入起点位置,这里的起点位置就是日常生活观念中的顺序,开始点是(1,1),而不是数组中的初始位置(0,0),输入错误则提示重新输入,时间复杂度为。

int main()

{ //主函数

int x,y;

char ch='y’;

while(ch=='y')

{

printf(" 中国象棋马的遍历\n:");

Mark_Che();

Mark_Dir();

while(1)

{

printf("请输入入口点横坐标(在案1-10之间):");

scanf("%d",&x);

if(y<1||y>9)

printf("输入错误,请重新输入!(横坐标在1-10之间)\n");

else

break;

}

while(1)

{

printf("请输入入口点纵坐标(在1-9之间):");

scanf("%d",&y);

if(y<1||y>9)

printf("输入错误,请重新输入!(纵坐标在1-9之间)\n");

else

break;

}

Knight(x,y);

Getchar();

Printf("\n");

printf("是否继续马的遍历(是:y;否:其他):");

fflush(stdin);

scanf("%c",&ch);

}

}

5.6棋盘初始化函数void Mark_Che(int v)

此函数作为棋盘初始化函数,因为每次执行程序时,棋盘上必须是全部都没有走过的。它会自动进行初始化棋盘,在14*13的棋盘上初始化。初始化后,棋盘大小的区域全部是0,而周围的两堵墙标志为1,时间复杂度为。

void Mark_Che()

{ //标志棋盘函数int i,j;

for(i=0;i<14;i++) //首先全部标记为0 for(j=0;j<13;j++)

chess[i][j]=0;

for(i=0;i<2;i++) //前面两行标记为1 for(j=0;j<13;j++)

chess[i][j]=1;

for(j=0;j<2;j++) //前面两列标记为1 for(i=0;i<14;i++)

chess[i][j]=1;

for(j=11;j<13;j++) //后面两列标记为1

for(i=0;i<14;i++)

chess[i][j]=1;

for(i=12;i<14;i++)

for(j=0;j<13;j++) //后面两行标记为1

chess[i][j]=1;

}

5.7标记初始化函数void Mark_Dir()

此函数和上面的函数功能类似,也是初始化才用,它是为栈的实现提供帮助的。开始时全部标记为0,表示周围的八个方向都可以走,时间复杂度为。

void Mark_Dir()

{ //初始化,为栈的实现做准备,全部标记为0,表示八个方向都是通路

//由于三维数组赋初值比较困难,因而采用单独的函数实现

int i,j,k;

for(i=0;i<14;i++)

for(j=0;j<13;j++)

for(k=0;k<8;k++)

CanPass[i][j][k]=0;

}

结论

从这周的上机实践中,我体会到上机的重要性。编写程序,离不开上机,一段不懂的代码只有经过反复的研读,调试与修改,最终变成自己的代码。一周的学习,让我学会一些知识,不在于学到了那么点技术,而在于心理得到了洗礼!在此,我不说老师的功劳,也不提以前怎么怎么没好好听讲,没好好复习,没好好珍惜上机的机会。但这次,最终我确实得到了锻炼,这就足够了!对于接下来的路程,脚踏实地,勤奋努力比什么都重要;代码是枯燥的,但不枯燥的是学习的过程,难得的是学习过程中体会的快乐,有目标的学习与坚持,生活才会更加美好!

参考文献

[1]《数据结构》(C语言版),严蔚敏,清华大学出版社,2003.

[2]《数据结构题集》,严蔚敏,清华大学出版社,2005.

[3]《数据结构》(C语言版),刘大有,高等教育出版社,2004.

[4]《Data Structure with C++》,William Ford.William Topp,清华大学出版社,2003.

附录A:程序代码

#include

#include

int chess[14][13];

//定义棋盘

int CanPath[14][13][8];

//每个棋子的八个方向哪些可以走

typedef struct{ //棋盘的八个方向int x,y;

}direction;

direction dir[8]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; //马遍历的八个方向

//栈的设计(顺序到达的各点坐标,还要有从前一点到达本点的方向)

typedef struct{

int x,y; //马的走过位置

int di; //马走的方向

}pathnode;

typedef struct{

pathnode pa[90];

int top;

}path; //顺序栈

void Init_Path(path *p)

{ //初始化栈

p->top=-1;

}

int Push_Path(path *p,pathnode t)

{ //进栈点及其向下一位移动的方向入栈

if(p->top>=89)

return -1;

else

{

p->top++;

p->pa[p->top].x=t.x;

p->pa[p->top].y=t.y;

p->pa[p->top].di=t.di;

return 1;

}

}

int Empty_path(path p)

{ //判断栈是否为空

if(p.top<0) return 1;

else return 0;

}

int Pop_Path(path *p,pathnode *t)

{ //出栈

if(Empty_path(*p))

return -1;

else

{

t->x=p->pa[p->top].x;

t->y=p->pa[p->top].y;

t->di=p->pa[p->top--].di;

return 1;

}

}

int Count(int x,int y)

{ //计算每个节点周围有几个方向可以走

实验报告 马踏棋盘

2.4题马踏棋盘 题目:设计一个国际象棋的马踏棋盘的演示程序 班级:姓名:学号:完成日期: 一.需求分析 (1)输入的形式和输入值的范围:输入马的初始行坐标X和列坐标Y, X和Y的范围都是[1,8]。 (2)输出形式: 以数组下表的形式输入,i为行标,j为列标,用空格符号隔开。以棋盘形式输出,每一格打印马走的步数,这种方式比较直观 (3)程序所能达到的功能:让马从任意起点出发都能够遍历整个8*8的 棋盘。 (4)测试数据,包括正确输入及输出结果和含有错误的输入及其输出结 果。数据可以任定,只要1<=x,y<=8就可以了。 正确的输出结果为一个二维数组,每个元素的值表示马行走的第几步,若输入有错,则程序会显示:“输入有误!请重新输入……”并且要求用户重新输入数据,直至输入正确为止。 二.概要设计 (1)、位置的存储表示方式 (2) typedef struct { int x; int y; int from; }Point; (2)、栈的存储方式 #define STACKSIZE 70 #define STACKINCREASE 10 typedef struct Stack { Point *top; Point *base; int stacksize; }; (1)、设定栈的抽象数据类型定义: ADT Stack { 数据对象:D={ai | ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={|ai-1, ai∈D,i=2,…,n} 约定an端为栈顶,ai端为栈顶。 基本操作: InitStack(&s) 操作结果:构造一个空栈s, DestroyStack(&s) 初始条件:栈s已存在。 操作结果:栈s被销毁。 ClearStack(&s) 初始条件:栈s已存在。

数据结构课程设计图的遍历和生成树求解

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法课程设计 课程代码: 6014389 题目: 图的遍历和生成树求解实现 年级/专业/班: 学生姓名: 学号: 开始时间: 2012 年 12 月 09 日 完成时间: 2012 年 12 月 26 日 课程设计成绩: 指导教师签名:年月日

目录 摘要 (3) 引言 (4) 1 需求分析 (5) 1.1任务与分析 (5) 1.2测试数据 (5) 2 概要设计 (5) 2.1 ADT描述 (5) 2.2程序模块结构 (7) 软件结构设计: (7) 2.3各功能模块 (7) 3 详细设计 (8) 3.1结构体定义 (19) 3.2 初始化 (22) 3.3 插入操作(四号黑体) (22) 4 调试分析 (22) 5 用户使用说明 (23) 6 测试结果 (24) 结论 (26)

摘要 《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的: ?了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; ?初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; ?提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 这次课程设计我们主要是应用以前学习的数据结构与面向对象程序设计知识,结合起来才完成了这个程序。 因为图是一种较线形表和树更为复杂的数据结构。在线形表中,数据元素之间仅有线性关系,每个元素只有一个直接前驱和一个直接后继,并且在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,本程序是采用邻接矩阵、邻接表、十字链表等多种结构存储来实现对图的存储。采用邻接矩阵即为数组表示法,邻接表和十字链表都是图的一种链式存储结构。对图的遍历分别采用了广度优先遍历和深度优先遍历。 关键词:计算机;图;算法。

马踏棋盘实验报告

西安郵電學院 数据结构 课内实验报告书 院系名称:计算机学院 实验题目:马踏棋盘 学生姓名: 专业名称:计算机科学与技术班级: 学号: 时间: 2011年10月10日指导教师:曾艳

一、实验题目:马踏棋盘 二、实验目的: 通过本次实验,熟练掌握抽象数据类型栈和队列的实现,学会使用栈和队列解决具体应用问题,从而体会栈和队列的特点。 三、实验要求: 设计一个国际象棋的马踏遍棋盘的演示程序。 要求:将马随机放在国际象棋的8×8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之 四、设计与实现过程 (1)栈或队列的定义及其主要操作的实现 struct Chess { int x; int y; int h;/*h记录下一次需要试探的马字格式的下标值*/ }Chess1[65]; (2)主要算法的描述 void Handlechess(int m,int n) { int flag=1,i; double j=0.0;/*增加了j用于统计while循环的执行次数,很好奇循环到底执行了多少次*/ int chessx[8]={-2,-2,-1,-1,1,1,2,2};/*马字的格式的8个位置,按下标序依次试探*/ int chessy[8]={-1,1,-2,2,-2,2,-1,1}; for(i=1;i<=64;i++) Chess1[i].h=0;/*赋初值*/ chess[m][n]=flag; Chess1[flag].x=m; Chess1[flag].y=n; while(flag<64) { j+=1.0; for(i=Chess1[flag].h;i<8;i++)/*i的初值由Chess1[flag].h确定*/ { m=Chess1[flag].x+chessx[i]; n=Chess1[flag].y+chessy[i]; if((m>=0&&m<=7&&n>=0&&n<=7)&&(chess[m][n]==0))/*去掉了函数,改为直接用关系表达式判断,提高运行速度*/ { Chess1[flag].h=i+1;/*h记录下一次需试探马字格式位置的下标*/ flag++;

图的深度优先遍历算法课程设计报告

合肥学院 计算机科学与技术系 课程设计报告 2013~2014学年第二学期 课程数据结构与算法 课程设计名称图的深度优先遍历算法的实现 学生姓名陈琳 学号1204091022 专业班级软件工程 指导教师何立新 2014 年9 月 一:问题分析和任务定义 涉及到数据结构遍会涉及到对应存储方法的遍历问题。本次程序采用邻接表的存储方法,并且以深度优先实现遍历的过程得到其遍历序列。

深度优先遍历图的方法是,从图中某顶点v 出发: (1)访问顶点v ; (2)依次从v 的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v 有路径相通的顶点都被访问; (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 二:数据结构的选择和概要设计 设计流程如图: 图1 设计流程 利用一维数组创建邻接表,同时还需要一个一维数组来存储顶点信息。之后利用创建的邻接表来创建图,最后用深度优先的方法来实现遍历。 图 2 原始图 1.从0开始,首先找到0的关联顶点3 2.由3出发,找到1;由1出发,没有关联的顶点。 3.回到3,从3出发,找到2;由2出发,没有关联的顶点。 4.回到4,出4出发,找到1,因为1已经被访问过了,所以不访问。

所以最后顺序是0,3,1,2,4 三:详细设计和编码 1.创建邻接表和图 void CreateALGraph (ALGraph* G) //建立邻接表函数. { int i,j,k,s; char y; EdgeNode* p; //工作指针. printf("请输入图的顶点数n与边数e(以逗号做分隔符):\n"); scanf("%d,%d",&(G->n),&(G->e)); scanf("%c",&y); //用y来接收回车符. for(s=0;sn;s++) { printf("请输入下标为%d的顶点的元素:\n",s); scanf("%c",&(G->adjlist[s].vertex)); scanf("%c",&y); //用y来接收回车符.当后面要输入的是和单个字符有关的数据时候要存贮回车符,以免回车符被误接收。 G->adjlist[s].firstedge=NULL; } printf("请分别输入该图的%d条弧\n",G->e); for(k=0;ke;k++) { printf("请输入第%d条弧的起点和终点(起点下标,终点下标):\n",(k+1)); scanf("%d,%d",&i,&j); p=(EdgeNode*)malloc(sizeof(EdgeNode)); p->adjvex=j; p->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=p; } } 2.深度优先遍历 void DFS(ALGraph* G,int v) //深度优先遍历 { EdgeNode* p;

马踏棋盘数据结构实践报告

马踏棋盘问题 摘要: 马踏棋盘就是在国际象棋8X8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。理解栈的“后进先出”的特性以及学会使用回溯。 关键字:马踏棋盘、递归、栈、回溯 1.引言 马踏棋盘就是在国际象棋8X8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。 编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2….64依次填入一个8X8的方阵,并输出它的行走路线。输入:任意一个起始位置;输出:无重复踏遍棋盘的结果,以数字1-64表示行走路线。 2.需求分析 (1)需要输出一个8X8的棋盘,可以采用二维数组的方法实现。 (2)输入马的起始位置,必须保证输入的数字在规定范围内,即0<=X<=7,0<=Y<=7。 (3)保证马能走遍整个棋盘,并且不重复。

(4)在棋盘上输出马的行走路线,标记好数字1、2、3直到64。 3.数据结构设计 采用栈数组为存储结构。 #define maxsize 100 struct { int i; int j; int director; }stack[maxsize]; 4.算法设计 4.1 马的起始坐标 void location(int x,int y) //马的位置坐标的初始化 { top++; stack[top].i=x; //起始位置的横坐标进栈 stack[top].j=y; //起始位置的竖坐标进栈 stack[top].director=-1;

a[x][y]=top+1; //标记棋盘Try(x,y); //探寻的马的行走路线 } 4.2 路径探寻函数 void Try(int i,int j) { int count,find,min,director; int i1,j1,h,k,s; int b[8]={-2,-2,-1,1,2,2,1,-1},c[8]={1,-1,-2,-2,-1,1,2,2} ; //存储马各个出口相对当前位置行、列坐标的增量数组 int b2[8],b1[8]; for(h=0;h<=7;h++) //用数组b1[8]记录当前位置的下一个位置的可行路径的条数 { count=0; i=stack[top].i+c[h]; j=stack[top].j+b[h]; if(i>=0&&i<=7&&j>=0&&j<=7&&a[i][j]==0) //如果找到下一个位置 { for(k=0;k<=7;k++) { i1=i+c[k]; j1=j+b[k]; if(i1>=0&&i1<=7&&j1>=0&&j1<=7&&a[i1]

图的遍历实现课程设计 数据结构 程序 图

数据结构课程设计 设计说明书 图的遍历的实现 数学与计算机科学学院 2014年1 月 4日 学生姓名 英 茜 学 号 1118064033 班 级 网络1101班 成 绩 指导教师 申 静

课程设计任务书 2013—2014学年第一学期 课程设计名称:数据结构课程设计 课程设计题目:图的遍历实现 完成期限:自2013年12 月23日至2014年 1 月4 日共 2 周 设计内容: 1. 任务说明 (1) 采用邻接表存储结构创建一个图; (2) 编程实现图的深度优先搜索(或广度优先搜索)遍历算法; (3) 输出遍历结果; (4) 给定具体数据调试程序。 2. 要求 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么? 2)逻辑设计:写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。 5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析; 7)编写课程设计报告。 3. 参考资料 指导教师:申静教研室负责人:余冬梅 课程设计评阅

摘要 针对图问题中如何更好地实现图的遍历问题,以无向图为例,分别采用广度优先遍历和深度优先遍历的算法实现对各节点的遍历,以VC++为开发环境进行系统的设计和实现,其运行结果表明,系统能很好地完成遍历后节点的输出,实现了遍历的目的,系统界面友好,可操作性强。 关键词:数据结构;存储结构;邻接矩阵

人工智能深度优先算法课程设计报告

人工智能课程报告 题目: 深 度 优 先 算 法 班级:XXXXXXXXXXX 学号:XXXXXXXXXXX 姓名:XXXXXXXXXXX

【摘要】结合生活中解决搜索问题所常用的思考方法与解题方法,从深度优先探讨了提高程序效率的适用技巧。 【关键词】1搜索顺序;2搜索对象;3搜索优化; 一、深度优先搜索的优化技巧 我们在做事情的时候,经常遇到这类问题——给出约束条件,求一种满足约束条件的方案,这类问题我们叫它“约束满足”问题。对于约束满足问题,我们通常可以从搜索的顺序和搜索的对象入手,进而提高程序的效率。 二、搜索的顺序及对象: 在解决约束满足问题的时候,问题给出的约束条件越强,对于搜索就越有利。之所以深度优先搜索的效率在很大程度上优于穷举,就是因为它在搜索过程中很好的利用了题目中的约束条件进行优化,达到提高程序效率的目的。 显然,在同样的一棵搜索树中,越在接近根接点的位置利用约束条件优化效果就越好。如何在搜索中最大化的利用题目的约束条件为我们提供剪枝的依据,是提高深度优先搜索效率的一个很重要的地方。而不同的搜索顺序和搜索对象就直接影响到我们对于题目约束条件的运用。 三、搜索特点 1.由于深度搜索过程中有保留已扩展节点,则不致于重复构造不必要的子树系统。 2.深度优先搜索并不是以最快的方式搜索到解,因为若目标节点在第i层的某处,必须等到该节点左边所有子树系统搜索完毕之后,才会访问到该节点,因此,搜索效率还取决于目标节点在解答树中的位置。

3.由于要存储所有已被扩展节点,所以需要的内存空间往往比较大。 4.深度优先搜索所求得的是仅仅是目前第一条从起点至目标节点的树枝路径,而不是所有通向目标节点的树枝节点的路径中最短的路径。 5.适用范围:适用于求解一条从初始节点至目标节点的可能路径的试题。若要存储所有解答路径,可以再建立其它空间,用来存储每个已求得的解。若要求得最优解,必须记下达到目前目标的路径和相应的路程值,并与前面已记录的值进行比较,保留其中最优解,等全部搜索完成后,把保留的最优解输出。 四、算法数据结构描述 深度优先搜索时,最关键的是结点扩展(OPEN)表的生成,它是一个栈,用于存放目前搜索到待扩展的结点,当结点到达深度界限或结点不能再扩展时,栈顶结点出栈,放入CLOSE表(存放已扩展节点),继续生成新的结点入栈OPEN 表,直到搜索到目标结点或OPEN栈空为止。 具体算法如下: ①把起始结点S放到非扩展结点OPEN表中(后进先出的堆栈),如果此结点为一目标结点,则得到一个解。 ②如果OPEN为一空表,则搜索失败退出。 ③取OPEN表最前面(栈顶)的结点,并把它放入CLOSED的扩展结点表中,并冠以顺序编号n。 ④如果结点n的深度等于最大深度,则转向2。 ⑤否则,扩展结点n,产生其全部子结点,把它们放入OPEN表的前头(入栈),并配上指向n的返回指针;如果没有后裔,则转向2。 ⑥如果后继结点中有任一个为目标结点,则求得一个解,成功退出;否则,转向2。

马踏棋盘分析文档

数据结构课程设计 题目:马踏棋盘 院系: 班级: 学号: 姓名: 2014-2015年度第1学期

马踏棋盘 一.题目:马踏棋盘 (3) 二. 设计目标 (3) 三. 问题描述 (3) 四. 需求分析 (4) 五. 概要设计 (4) 第一步:定义四个常量和一个数据类型 (4) 第二步:构造函数 (4) 六. 详细设计(给出算法的伪码描述和流程图) (5) 流程图设计 (5) 代码分析 (9) 第一步:定义常量与变量 (9) 第二步:构造函数 (9) ●定义一个结构体类型 (9) ●创建一个初始化函数 (10) ●创建提示输入函数 (10) ●创建产生新节点函数 (11) ●创建计算路径函数 (12) ●创建入栈函数 (13) ●创建出栈函数 (13) ●创建输出函数 (13)

第三步:在主函数中调用其它函数 (15) 七. 测试分析 (16) 八. 使用说明 (16) 九. 测试数据 (16) 十.课程设计总结 (17) 一.题目:马踏棋盘 二. 设计目标 帮助学生熟练掌握顺序栈的基本操作,让学生深入了解栈的使 用,使得更深层次的灵活运用栈。 三. 问题描述 ○所谓的马踏棋盘是:将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。由用户自行指定一个马的初始位置,求出马的行走路线,并按照求出的行走路线的顺序,将数字1、2、…、64依次填入一个8X8的方阵并输出。 从用户给出的初始位置开始判断,按照顺时针顺序,每次产生一个新的路点,并验证此路点的可用性,需要考虑的是当前路点是否超出棋盘范围和此路点是否已经走过。如果新路点可用,则入栈,并执行下一步,重复进行如上步骤,每次按照已走路点的位置生成新路点。如果一个路点的可扩展路数为0,进行回溯,直到找到一个马能踏遍棋盘的行走路线并输出。

数据结构课程设计之图的遍历和生成树求解

##大学 数据结构课程设计报告题目:图的遍历和生成树求解 院(系):计算机工程学院 学生: 班级:学号: 起迄日期: 2011.6.20 指导教师:

2010—2011年度第 2 学期 一、需求分析 1.问题描述: 图的遍历和生成树求解实现 图是一种较线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(及其孩子结点)相关但只能和上一层中一个元素(即双亲结点)相关;而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。 生成树求解主要利用普利姆和克雷斯特算法求解最小生成树,只有强连通图才有生成树。 2.基本功能 1) 先任意创建一个图; 2) 图的DFS,BFS的递归和非递归算法的实现 3) 最小生成树(两个算法)的实现,求连通分量的实现 4) 要求用邻接矩阵、邻接表等多种结构存储实现 3.输入输出

输入数据类型为整型和字符型,输出为整型和字符 二、概要设计 1.设计思路: a.图的邻接矩阵存储:根据所建无向图的结点数n,建立n*n的矩阵,其中元素全是无穷大(int_max),再将边的信息存到数组中。其中无权图的边用1表示,无边用0表示;有全图的边为权值表示,无边用∞表示。 b.图的邻接表存储:将信息通过邻接矩阵转换到邻接表中,即将邻接矩阵的每一行都转成链表的形式将有边的结点进行存储。 c.图的广度优先遍历:假设从图中的某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再访问此邻接点的未被访问的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中还有未被访问的,则另选未被访问的重复以上步骤,是一个非递归过程。 d.图的深度优先遍历:假设从图中某顶点v出发,依依次访问v的邻接顶点,然后再继续访问这个邻接点的系一个邻接点,如此重复,直至所有的点都被访问,这是个递归的过程。 e.图的连通分量:这是对一个非强连通图的遍历,从多个结点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其连通分量的顶点集。本程序利用的图的深度优先遍历算法。 2.数据结构设计: ADT Queue{ 数据对象:D={a i | a i ∈ElemSet,i=1,2,3……,n,n≥0} 数据关系:R1={| a i-1 ,a i ∈D,i=1,2,3,……,n} 基本操作: InitQueue(&Q) 操作结果:构造一个空队列Q。 QueueEmpty(Q) 初始条件:Q为非空队列。 操作结果:若Q为空队列,则返回真,否则为假。 EnQueue(&Q,e) 初始条件:Q为非空队列。 操作结果:插入元素e为Q的新的队尾元素。 DeQueue(&Q,e) 初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e返回其值。}ADT Queue

数据结构 马踏棋盘 设计报告

《数据结构》 课程设计报告 课程名称:《数据结构》课程设计课程设计题目: 姓名: 院系: 专业: 年级: 学号: 指导教师: 2011年月日

目录 1、程序设计的目的 2、设计题目 3、分析 4、设计思想 5、算法 6、测试结果 7、调试分析 8、小结 1、课程设计的目的 1、熟练使用C++语言编写程序,解决实际问题; 2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 5、学习并熟悉栈的有关操作; 6、利用栈实现实际问题; 2、设计题目 【马踏棋盘】 *问题描述:将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走棋规则进行移动。要求每个方格上只进入一次,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。 *测试数据:由读者指定,可自行指定一个马的初始位置。 *实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。并探讨每次选择位置的“最佳

策略”,以减少回溯的次数。 3、分析 确定输入值的范围,输入马的初始行坐标X和Y,X和Y的范围都是1到8之间。程序的功能是输出马走的步骤,要使马从任一起点出发,通过程序能找到下一个地点,然后遍历整个棋盘。每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。并探讨每次选择位置的“最佳策略”,以减少回溯的次数。输出时可以用二维数组。 4、设计思想 输入马初始位置的坐标。将初始位置进栈,经过一个while循环,取出符合条件的栈顶元素。利用函数,找出栈顶元素周围未被占用的新位置,如果有,新位置入栈;否则弹出栈顶元素。再进行判断,最后输出。 位置的存储方式,栈的存储方式和一些操作函数为: #include #ifndef STACK_H #define STACK_H struct Point { int x; int y; int from; }; #define STACKSIZE 70 #define STACKINCREASE 10 struct Stack { Point *top; Point *base; int length;

课程设计-图的遍历

目录 一、课题的主要功能 (2) 1.1设计内容 (2) 1.2对课程设计功能的需求分析 (2) 二、课题的功能模块的划分 (2) 2.1模块划分 (2) 2.2系统的概要设计 (3) 三、主要功能的实现 (4) 3.1算法思想 (4) 1.图的邻接矩阵的建立 (4) 2.图的遍历的实现 (4) 3.2数据结构 (4) 3.3主函数流程图 (5) 3.4深度优先遍历流程图 (6) 3.5深度优先遍历递归 (7) 3.6深度优先遍历流程图 (9) 3.7广度优先遍历递归流程图 (10) 四、程序调试 (11) 4.1程序的调试分析 (11) 4.2程序的测试结果 (11) 五、总结 (16) 六、附件 (16) 6.1源程序

一、课题的主要功能 1.1设计内容 演示图的深度优先, 广度优先遍历过程,并输出原图结构及遍历结果。要求图的结点数不能少于6个。可以由系统随机生成图,也可以由用户手动输入图。报告中要写出画图的思路;画出图的结构,有兴趣的同学可以进一步改进图的效果。 1.2对课程设计功能的需求分析 图的遍历并不需要是一个过于复杂的工作环境,一般来说:最合适的才是最好的。软件设计必须符合我们使用实际情况的需要。根据要求,图的遍历主要功能如下: 1.用户可以随时建立一个有向图或无向图; 2.用户可以根据自己的需要,对图进行深度遍历或广度遍历; 3.用户可以根据自己的需要对图进行修改; 4.在整个程序中,用户可以不断的按照不同的方式对图进行遍历,若不继续,用户也可以随时跳出程序,同时,如果用户输入的序号错误,程序会提示用户重新输入序号; 二、课题的功能模块的划分 2.1模块划分 1.队列的初始化、进队、出队、队列空、队列满的函数 void InitQueue(CirQueue *Q) //初始化队列 int QueueEmpty(CirQueue *Q)//队列是否为空 int QueueFull(CirQueue *Q)//队列满 Void EnQueue(CirQueue *Q,int x)//将队员进队 int DeQueue(CirQueue *Q)//将队员出队 2.创建图的函数 void CreateMGraph(MGraph *G)//根据用户需要创建一个图 3.图的深度优先遍历递归 void DFSM(MGraph *G,int i)/*含有输出已访问的顶点的语句*/

数据结构课程设计报告(图的遍历)

中南大学 课程设计报告 题目数据结构课程设计学生姓名 指导教师漆华妹 学院信息科学与工程学院专业班级 学号 完成时间 2011年07月

目录 第一章、需求分析 (2) 第二章、概要设计 (2) 2.1设定图的抽象数据类型 (2) 2.2设定队列的抽象数据类型 (3) 2.3本程序包含的功能模块 (3) 第三章、详细设计 (3) 3.1顶点、边和图的类型 (6) 3.2队列类型 (8) 3.3主程序和其他伪码算法 (9) 第四章、调试分析 (9) 第五章、用户手册 (9) 第六章、测试结果 (10) 第七章、心得体会 (10) 附:源程序代码 (11)

图遍历的演示 题目:试设计一个程序,演示在连通的无向图上访问全部结点的操作 第一章、需求分析 1、以邻接多重表为存储结构; 2、实现连通和非连通的无向图的深度优先和广度优先遍历; 3、要求利用栈实现无向图的深度优先遍历; 4、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和生成树的边集; 5、用凹入表打印生成树; 6、求出从一个结点到另外一个结点,但不经过另外一个指定结点的所有简单路径;6、本程序用C语言编写,在C-Free3.5环境下通过。 第二章、概要设计 1、设定图的抽象数据类型: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为点集. 数据关系R: R={VR} VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径} 基本操作P: CreatGraph(&G,V,VR) 初始条件:V是图的顶点集,VR是图中弧的集合. 操作结果:按V和VR是定义构造图G. DestroyGraph(&G) 初始条件:图G存在 操作结果:销毁图G LocateVex(G,u) 初始条件: 图G存在,u和G中顶点有相同的特征 操作结果:若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息GetVex(G,v) 初始条件: 图G存在,v是G中顶点 操作结果:返回v的值 FirstAjvex(G,v) 初始条件: 图G存在,v是G中顶点 操作结果:返回v的第一个邻接顶点,若顶在图中没有邻接顶点,则返回为空 NextAjvex(G,v,w) 初始条件: 图G存在,v是G中顶点,w是v的邻接顶点 操作结果:返回v的下一个邻接顶点,若w是v的最后一个邻接顶点,则返回空DeleteVexx(&G,v) 初始条件: 图G存在,v是G中顶点 操作结果:删除顶点v已经其相关的弧 DFSTraverse(G,visit()) 初始条件: 图G存在,visit的顶点的应用函数

图的遍历实现课程设计-数据结构-程序-图

数据结构课程设计 设计说明书 图的遍历的实现 学生姓名英茜 学号1118064033 班级网络1101班 成绩 指导教师申静 数学与计算机科学学院 2014年1 月4日

课程设计任务书 2013—2014学年第一学期 课程设计名称:数据结构课程设计 课程设计题目:图的遍历实现 完成期限:自2013年12月23日至2014年1月4日共 2 周 设计内容: 1. 任务说明 (1)采用邻接表存储结构创建一个图; (2)编程实现图的深度优先搜索(或广度优先搜索)遍历算法; (3) 输出遍历结果; (4) 给定具体数据调试程序。 2.要求 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么? 2)逻辑设计:写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。 5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析; 7)编写课程设计报告。 3. 参考资料 指导教师:申静教研室负责人:余冬梅 课程设计评阅

摘要 针对图问题中如何更好地实现图的遍历问题,以无向图为例,分别采用广度优先遍历和深度优先遍历的算法实现对各节点的遍历,以VC++为开发环境进行系统的设计和实现,其运行结果表明,系统能很好地完成遍历后节点的输出,实现了遍历的目的,系统界面友好,可操作性强。 关键词:数据结构;存储结构;邻接矩阵

图的深度广度遍历(算法与数据结构课程设计)

图的操作 一、问题描述 图是一种较线性表和树更为复杂的数据结构。在图形结构中,节点间的关系可以是任意的,图中任意两个数据元素之间都可以相关。由此,图的应用极为广泛。现在邻接矩阵和邻接表的存储结构下,完成图的深度、广度遍历。 二、基本要求 1、选择合适的存储结构完成图的建立; 2、建立图的邻接矩阵,能按矩阵方式输出图,并在此基础上,完成图的深度和广度遍历,输出遍历序列; 3、建立图的邻接表,并在此基础上,完成图的深度和广度遍历,输出遍历序列; 三、测试数据 四、算法思想 1、邻接矩阵 顶点向量的存储。用两个数组分别存储数据(定点)的信息和数据元素之间的关系(边或弧)的信息。 2、邻接表 邻接表是图的一种链式存储结构。在邻接表中,对图中每个定点建立一个单链表,第i 个单链表中的节点表示依附于定点vi的边。每个节点由3个域组成,其中邻接点域(adjvex)指示与定点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的节点;数据域(info)存储和边或弧相关的信息,如权值等。每个链表上附设一个头节点。在表头节点中,

除了设有链域(firstarc)指向链表中第一个节点之外,还设有存储定点vi的名或其他有关信息的数据域(data)。 3、图的深度遍历 深度优先搜索遍历类似于树的先根遍历,是树的先跟遍历的推广。假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,甚至图中所有和v相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 4、图的广度遍历 广度优先遍历类似于树的按层次遍历过程。假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先与“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个 曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 五、模块划分 一、基于邻接矩阵的深广度遍历 1.Status InitQueue(LinkQueue *Q) 根据已知Q初始化队列 2.Status QueueEmpty (LinkQueue Q) 判断队列是否为空 3.Status EnQueue(LinkQueue *Q, QElemType e) 将e压入队尾 4.Status DeQueue(LinkQueue *Q, QElemType *e) 取队头元素e 5.int LocateVex(MGraph G,VertexType v) 定位定点v 6.void CreateGraph(MGraph *G) 建立无向图的邻接矩阵 7.void PrintGraph(MGraph G) 输出邻接矩阵的无向图 8.int FirstAdjVex(MGraph G,int v) 第一个邻接点的定位 9.int NextAdjVex(MGraph G,int v,int w) 查找下一个邻接点

数据结构课程设计-图的遍历和构建

摘要 图(Graph)是一种复杂的非线性结构。图可以分为无向图、有向图。若将图的每条边都赋上一个权,则称这种带权图网络。在人工智能、工程、数学、物理、化学、计算机科学等领域中,图结构有着广泛的应用。在图结构中,对结点(图中常称为顶点)的前趋和后继个数都是不加以限制的,即结点之间的关系是任意的。图中任意两个结点之间都可能相关。图有两种常用的存储表示方法:邻接矩阵表示法和邻接表表示法。在一个图中,邻接矩阵表示是唯一的,但邻接表表示不唯一。在表示的过程中还可以实现图的遍历(深度优先遍历和广度优先遍历)及求图中顶点的度。当然对于图的广度优先遍历还利用了队列的五种基本运算(置空队列、进队、出队、取队头元素、判队空)来实现。这不仅让我们巩固了之前学的队列的基本操作,还懂得了将算法相互融合和运用。

目录 第一章课程设计目的..................................................................................... 错误!未定义书签。第二章课程设计内容和要求....................................................................... 错误!未定义书签。 2.1课程设计内容.................................................................................. 错误!未定义书签。 2.1.1图的邻接矩阵的建立与输出?错误!未定义书签。 2.1.2图的邻接表的建立与输出............................................... 错误!未定义书签。 2.1.3图的遍历的实现.................................................................... 错误!未定义书签。 2.1.4图的顶点的度................................................................. 错误!未定义书签。 2.2 运行环境......................................................................................... 错误!未定义书签。第三章课程设计分析..................................................................................... 错误!未定义书签。 3.1图的存储............................................................................................ 错误!未定义书签。 3.1.1图的邻接矩阵存储表示................................................. 错误!未定义书签。 3.1.2 图的邻接表存储表示........................................................... 错误!未定义书签。 3.2图的遍历..................................................................................... 错误!未定义书签。 3.2.1 图的深度优先遍历............................................................. 错误!未定义书签。 3.2.2 图的广度优先遍历?错误!未定义书签。 3.3图的顶点的度.................................................................................. 错误!未定义书签。第四章算法(数据结构)描述?错误!未定义书签。 4.1 图的存储结构的建立。?错误!未定义书签。 4.1.1 定义邻接矩阵的定义类型 (7) 4.1.2定义邻接表的边结点类型以及邻接表类型........................ 错误!未定义书签。 4.1.3初始化图的邻接矩阵?错误!未定义书签。 4.1.4初始化图的邻接表?错误!未定义书签。 4.2 图的遍历?错误!未定义书签。 4.2.1 深度优先遍历图................................................................. 错误!未定义书签。 4.2.2 广度优先遍历图?错误!未定义书签。 4.3 main函数........................................................................................ 错误!未定义书签。 4.4图的大致流程表........................................................................... 错误!未定义书签。第五章源代码?错误!未定义书签。 第六章测试结果............................................................................................. 错误!未定义书签。第七章思想总结?错误!未定义书签。 第八章参考文献........................................................................................... 错误!未定义书签。

数据结构课程设计题目及要求_49968

《数据结构》课程设计题目 课程设计题一:学生成绩管理系统 设计目的: 1 掌握线性链表的建立。 2 掌握线性链表的基本操作。 3 掌握查找的基本算法。 设计内容: 利用线性链表实现学生成绩管理系统,具体功能:输入、输出、插入、删除、查找、追加、读入、显示、保存、拷贝、排序、索引、分类合计、退出,并能在屏幕上输出操作前后的结果。 设计要求: 1 写出系统需求分析,并建模。 2 编程实现,界面友好。 3 输出操作前后的结果。 课程设计题二:停车场管理系统 设计目的: 1 掌握栈和队列的建立。 2 掌握栈和队列的基本操作。 3 深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们。 4 加深对栈和队列的理解和认识。 设计内容: 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。 设计要求: 1 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 2 每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。 3 对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费,功能可自己添加)。 课程设计题三:约瑟夫(Joseph)环 设计目的:

数据结构课程设计报告_马踏棋盘

. 杭州师范大学钱江学院课程设计 题目马踏棋盘算法研究 教学院信息与机电工程分院 专业计算机科学与技术 班级计算机1201 姓名吴秋浩 指导教师王李冬 2013 年12 月21 日

目录 一.概述 (3) 二.总体方案设计 (3) 三.详细设计 (4) 四.最终输出 (7) 五.课程设计总结 (11) 参考文献 (15)

一概述 1.课程设计的目的 (1)课题描述 设计一个国际象棋的马踏遍棋盘的演示程序。 (2)课题意义 通过“马踏棋盘”算法的研究,强化了个人对“栈”数据结构的定义和运用,同时也锻炼了自身的C语言编程能力。另一方面,通过对“马踏棋 盘”算法的研究,个人对“迷宫”、“棋盘遍历”一类的问题,有了深刻 的认识,为今后解决以此问题为基础的相关的问题,打下了坚实的基础。 (3)解决问题的关键点说明 解决问题的关键首先要熟练掌握C语言编程技术,同时能够熟练运用“栈”数据结构。另外,态度也是非常重要的。在课程设计过程中,难免 会遇到困难,但是不能轻易放弃,要肯花时间,能静得下心,积极查阅相 关资料,积极与指导老师沟通。 2.课程设计的要求 (1)课题设计要求 将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方 格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1, 2,…,64依次填入一个8×8的方阵,输出之。 程序由回溯法和贪心法实现,比较两种算法的时间复杂度。 (2)课题设计的思路 首先,搞清楚马每次在棋盘上有8个方向可走,定义两个一位数组,来存储马下一着点的水平和纵向偏移量。程序再定义一个8*8二维数组,初始 所有元素置0,起始点元素置1。若为回溯法,初始方向数据(一维数组下 标)入栈。随后,马从起始点开始,每次首先寻找下一可行的着点,然后记 下方向,方向数据入栈,把该位置元素置为合适的序列号,若无下一可行着 点,则回溯,寻找下一方向位置着点,以此类推,直到64填入数组中,则 输出二维数组,即为马可走的方案。若为贪婪法,选择下一出口的贪婪标准 是在那些允许走的位置中,选择出口最少的那个位置。直到没有下一着点位 置,若此时已标记到64,则找到可行方案,输出之。反之,改变初始寻找方 向继续寻找,直到8种方向顺序都试过,若还是没有合适的方案,则说明以 该起始 点开始马无法踏遍棋盘。

相关文档
最新文档