数据结构实验五——马踏棋盘问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
桂林电子科技大学
数学与计算科学学院综合性、设计性实验报告
实验室:06303 实验日期:2014年7月1日院(系)数学与计算科学年级专业、班12007301 姓名成绩
课程名称数据结构实验实验项目
名称
马踏棋盘问题指导
教师
张慧敏
教师
评语
教师签名:
年月日一、实验目的和要求
加深对图的理解,培养解决实际问题的编程能力。根据数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来,培养基本的、良好的程序设计技能。
2、马踏棋盘的问题描述
国际象棋马的走法:先直走或横走一格,再沿离开原来格子的方向斜走二格,合起来为一步棋;国际象棋棋盘黑白交错,格数8×8。
3、基本要求
1) 给出马从任意一个位置出发遍历整个棋盘的一条路径。
2) 在1)的基础上给出从该位置出发的所有遍历路径
4、设计思想
整个棋盘可表示为一个M×N的二维数组。假若马目前在位置(i,j)则马下一步可移动的位置0、1、……、7可分别表示为(i-2,j+1),(i-1,j+2),(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,j),有0
格子具有集合性,故考虑使用无向图来表示格子及其间关系;以邻接表作为该无向图中结点与相邻8个结点(4黑4白)的存储结构;以顶点表存储格子,每格为顶点表中一结点,其指针域指向该顶点所能到达的第一个结点。
表头结点:
Vex x y link
Vex:头结点所在的序号
x:头结点所在的横坐标;
y:头结点所在的纵坐标;
link:指向Vex下一个能够到达的邻接结点
链表中结点的结构同表头结点的结构同。在此不一一赘述了;
假定我们按照以下方式对棋盘上的格子进行编号(如红色标注),那么编号与格子所在的坐标(如蓝色标注)位置必然存在一定关系。(留给大家思考)
21(1,5)22(2,5)23(3,5)24(4,5)25(5,5)
16(1,4)17(2,4)18(3,4)19(4,4)20(5,4)
11(1,3)12(2,3)13(3,3)14(4,3)15(5,3)
6(1,2)7(2,2)8(3,2)9(4,2)10(5,2)
1(1,1)2(2,1)3(3,1)4(4,1)5(5,1)
综合起来,马踏棋盘问题就可以转化为图的遍历问题。
5、算法设计
#include
#include
#define n 8
#define maxsize 100
typedef int elemtype;
typedef struct /*栈的结构*/
{
elemtype data[maxsize];
int top;
}stack;
typedef struct node
{
int vex; /*头结点所在的序号*/
struct node *next; /*边表结点*/
}edgenode;
typedef struct
{
int x,y;
int vex; //顶点信息
edgenode *link; //指向Vex下一个能够到达的邻接结点
}vexnode; /*顶点表结点*/
vexnode ga[n*n];
int visited[n*n];
stack s;
int px[8]={1,2,2,1,-1,-2,-2,-1};
int py[8]={2,1,-1,-2,-2,-1,1,2};
void creatadjlist(vexnode g[]) /*创建无向图的邻链表*/
{
int i,j,k;
edgenode *s;
for(i=0;i for(j=0;j { g[n*i+j].x=j; g[n*i+j].y=i; g[n*i+j].vex=n*i+j; g[n*i+j].link=NULL; //边表头指针初始化 } for(k=0;k { for(i=0;i<8;i++) if((g[k].x+px[i]>=0)&&(g[k].x+px[i] s=malloc(sizeof(edgenode)); s->vex=n*(g[k].y+py[i])+g[k].x+px[i]; s->next=g[k].link; g[k].link=s; } } } int emptystack(stack *s) //判空栈 { if(s->top==-1) return 1; else return 0; } int push_stack(stack *s,elemtype x) //把元素x压入栈中 { if(s->top==maxsize-1) { printf("overflow!"); //栈满上溢