马踏棋盘c语言实验报告,马踏棋盘_实验报告.doc

马踏棋盘_实验报告

西安交通大学实验报告

课程 数据结构专题实验 实验名称 马踏棋盘 第 1 页 共 9 页

系别__ 自动化 实 验 日 期 2015 年 11 月 8 日

专业班级 自动化43班 实 验 报 告 日 期 2015 年 11月 15 日

姓 名 李欣阳 学号 2140504066 报 告 退 发 ( 订正 、 重做 )

同 组 人 无 教 师 审 批 签 字

一、实验目的

通过本次试验,熟练掌握抽象数据类型栈和队列的实现,学会用栈和队列解决具体应用问题,从而体会栈和队列的特点。

二、实验内容与要求

设计一个国际象棋的马踏棋盘的演示程序,满足:将马随机放在国际象棋8×8棋盘Broad[8][8]的某方格中,马按走棋规则进行移动。可以允许回溯,最终成功走遍棋盘上64个方格。编制非递归程序,求出马的行走路线,按求出的行走路线,将数字1,2,3,···,648×8方阵,并输出该方阵。

三、问题分析

3.1 下一个位置的确定

一般来说,当马处于位置( i ,j )时,可以走到下列八个位置之一,这些位置称之为该位置的邻接位置:

( 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 )

给以上八个位置依次编号,在棋盘上显示如下图:

⑧①⑦②Δ⑥③⑤④图1 某位置的八个邻接位置

但是如果( i ,j )靠近 -2,-1,1,2,2,1,-1,-2}

HTry2[8]={ 1,2,2,1,-1,-2,-2,-1}

位于( i ,j )的马可以走到的新位置是在棋盘范围内的|”,并在每行输出完成之后,额外输出一行“--”即可,输出表格线时要根据具体情况调整“--”的数目即可。

动态演示的实现需要每一步都输出一次步数标记数组Init1,间隔时间调用Sleep函数。由于Init1的初始化是所有元素赋值为零,在输出该数组时难免出现没走过的空位置显示为零的情况。因此为了使输出结果简洁美观,在输出数组之前先通过if语句把所有为零的位置(尚未走过的位置)转化为空格后再输出,而非零的位置原样输出即可。

四、栈结构及基本操作

4.1 栈的说明及抽象数据类型

本实验采用栈这一线性数据结构来实现,栈是限定仅在表尾进行插入或者删除操作的线性表,表尾称为栈顶,表头称为栈底。栈的抽象数据类型及基本操作定义如下:

ADT Stack{数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0}数据关系:R1={|ai-1,ai∈D, i=1,2, …,n } 约定an端为栈顶,a1端为栈底。

基本操作:InitStack( &S )

操作结果:构造一个空栈S。

DestroyStack ( S )

初始条件:栈S已存在。

操作结果:栈S被销毁。

Push( &S, e )初始条件:栈S已存在。

操作结果:插入元素e为新的栈顶元素。Pop( &S, &e )

初始条件:栈S已存在且非空。操作结果:删除S的栈顶元素,并用e返回其值。

StackEmpty ( S )

初始条件:栈S已存.

操作结果:若栈S非空则返回TURE,否则返回FALSE。

}ADT Stack

4.2 顺序栈的定义

栈的顺序存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时设定指针top指示栈顶元素在顺序栈中的位置。顺序栈的存数示意图及C语言定义为:

typedef struct{

int stacksize;

SElemType *base;

SElemType *top;

}SqStack;//顺序栈结构体

4.3顺序栈基本操作的算法描述

(1)栈的初始化:生成一个规定大小的空表,表尾表示栈顶,表头表示栈底。

int InitStack(SqStack &S){

S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));

if(!S.base) return 0;

S.top = S.base;

S.stacksize = STACK_INIT_SIZE;

return 1;

}//栈的初始化

(2)入栈操作:将元素x压入栈的top中,即顺序表表尾增加一个节点,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值