数据结构实验五——马踏棋盘问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]=0)&&(g[k].y+py[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!"); //栈满上溢

相关文档
最新文档