数据结构课程设计-马踏棋盘实验报告(仅供参考)
数据结构课程设计马的遍历

课程设计说明书课程名称:数据结构设计题目:马的遍历院系:计算机科学与信息工程学院学生姓名:学号:专业班级:指导教师:2015 年 6 月7 日课程设计任务书马的遍历摘要:中国象棋中马采用“日”字走法,对棋盘上马所在的结点,一步内到达的结点最多有八个,所以可以采用类似图的深度优先遍历,以马所在点为初始点对整个棋盘进行遍历。
然后按遍历的顺序输出结点可以用一个二维数组chess[][]来表示棋盘,一开始用来存放步骤号,若走过了则把它赋值为0。
对于动态演示问题,只要在“马”的位置显示“马”,已经走过的位置显示“●”,未走过的位置显示“┌”“┬”“┐”“├”等制表符,然后清屏,显示下一步,再清屏,依次类推。
关键词:深度优先遍历;回溯法;数组存储棋盘;动态演示;目录1.设计背景 (1)1.1问题描述 (1)1.2基本要求 (1)2.设计方案 (1)2.1问题分析和任务定义 (1)2.2概要设计和数据结构的选择 (2)3. 方案实施 (3)3.1数据结构设计 (3)3.2功能函数设计 (4)3.3编码实现 (5)4. 结果与结论 (14)4.1输入初始数据 (14)4.2判断能否遍历 (14)4.3动态演示 (14)5. 收获与致谢 (15)6.参考文献 (15)1. 设计背景1.1 问题描述:中国象棋是10*9的棋盘,马的走法是“马走日”,这里忽略了“蹩脚马”的情况,使马的遍历问题简单化。
马在棋盘上遍历采用算法当中的优先算法和回溯法;从入口出发,按某一方向向前探索,若能走通并且从未走过,即某处可到达,则到达新店,否则探索下一个方向;如果发生“阻塞”的情况,就是后面走不通的情况,则沿原路返回到前一点,换一个方向再继续试探,知道找到一条通路,或无路可走又返回到入口点。
期盼中马的遍历采用数组进行存储,同时因为有回溯,所以采用栈的方法,并且为了最后打印方便,采用的是顺序栈的方法。
同时还有八个方向的数组,和为栈设计的每个点周围的八个方向那些可以走的数组。
马踏棋盘 正式作业

数据结构与算法分析课程设计报告设计题目:马踏棋盘专业计算机科学与技术学号姓名年月日<<马踏棋盘>>数据结构课程设计概要设计功能模块化分析通过对问题描述的分析,可知马踏棋盘问题所要求实现的功能大致由三个部分组成:⑴接收用户输入的马的起始位置;⑵从起始位置开始在棋盘上标记马按问题描述中的行走规则访问棋盘中每个格子的顺序;⑶输出棋盘上标记的访问顺序。
系统结构的总体设计⑴输入模块:提示用户输入数据,接收用户输入的数据,即马的起始位置,并判断该位置是否在棋盘内。
若该起始位置在棋盘内,则接着执行下一模块的功能;若该起始位置不在棋盘内,则提示用户输入无效,并要求用户再次输入;⑵初始化模块:初始化所有的数据结构中的数据;⑶棋盘遍历模块:采用特定算法,按照马的行走规则对棋盘进行遍历,每次访问一个格子时,要测试该格子是否在棋盘范围内,保存马的访问顺序;⑷位置测试模块:接收格子的x和y坐标,判断该格子是否在棋盘内,然后根据该格子是否在棋盘内返回不同的信号;⑸输出模块:将棋盘遍历模块中保存下来的讯号进行输出,输出格式遵从棋盘格式;⑹总控模块:负责调用个处理模块,完成马踏棋盘问题的求解。
处理方式设计针对问题和核心模块,采用深度优先遍历思想和回溯算法的非递归形式。
⑴深度优先遍历的基本思想深度优先遍历可以从任意顶点开始访问图的顶点,然后把该顶点标记为已访问。
在每次迭代的时侯,该算法紧接着处理与当前顶点邻接的未访问顶点。
如果有若干个这样的顶点,可以任意选择一个顶点。
凡在实际应用中,选择哪一个邻接的未访问候选顶点主要是由表示图的数据结构决定的。
⑵回溯算法的基本思想回溯法是穷举查找技术的一个变种。
它每次只构造解的一个分量,然后按照下面的方法来评估这个部分构造解。
如果一个部分构造解可以进一步构造而不会违反问题的约束,我们就接受对解的下一个分量所做的第一个合法选择。
如果无法对下一分量进行合法的选择,就不必对剩下的任何分量再做任何选择了。
马踏棋盘程序设计方案

问题描述设计一个国际象棋的马踏棋盘的演示程序。
基本要求将马随机放在国际象棋8*8的棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。
要求每个方格只进入一次,走遍棋盘全部的64个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,3…….64一次填入一个8*8的方阵输出之测试数据可自行指定一个马的初始位置(i,j),0<=i,j<=7.。
实现提示一般说来,当马位于位置(i,j)时,可以走到下列8个位置之一(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)靠近棋盘的边缘,上述有些位置可能超出棋盘范围,成为不允许的位置。
8个可能位置可以用一维数组Htry1[0…7]和HTry2[0..7]来表示:Htry10 1 2 3 4 5 60 1 2 3 4 5 6位于(i,j)的马可以走到新位置是在棋盘范围内的(i+ Htry1[h],j+ Htry2[h]),其中h=0,1,….7.一.需求分析1.输入的形式和输入值的范围;分开输入马的初始行坐标X和列坐标Y,X和Y的范围都是[0,7]。
2.输出的形式;一共提供了2种输出方式:(1)以数组下标形式输入,代表起始位置,i表示行标,j表示列标。
(2)以棋盘形式输出,每一格打印马走的步数,这种方式比较直观。
3.程序所能达到的功能;让马从任一起点出发都能够历遍整个8×8的棋盘。
二.概要设计1.设定栈的抽象数据类型定义:ADT Stack{数据对象:D={ai|ai∈CharSet,i=1,2..,n}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}基本操作:(这里仅列举本题中使用的操作)InitStack(&S)操作结果:构建一个空栈。
棋盘算法实验报告(3篇)

个人自我介绍简单大方
很抱歉,但我无法为您提供____字的自我介绍。
以下是一个简洁而大方的自我介绍示例,供您参考:
大家好,我叫[姓名]。
很高兴有机会向大家介绍一下自己。
我出生并长大在[所在地],是一个勤奋、积极向上的人。
在学业方面,我于[毕业时间]从[学校名称]获得了[学位/专业]学位。
在大学期间,我通过自我努力和课外学习,取得了良好的学术成绩,并参与了一些学生组织和社团活动。
这些经历不仅培养了我的团队合作和领导能力,也加强了我的沟通和组织能力。
在工作方面,我有[工作年限]年的相关工作经验。
我曾在[公司/组织名称]担任[职位],负责[工作职责]。
在这期间,我不断努力提升自己的专业知识和技能,以适应快速发展的工作环境。
我善于分析问题并找出解决方案,能够有效地与团队合作并承担责任,这些都为我赢得了同事和上级的认可。
除了工作,我也积极参与志愿者活动,希望能为社区和弱势群体做一点贡献。
我相信,通过奉献和关心他人,我们可以建立一个更加和谐和温暖的社会。
在个人生活中,我喜欢阅读、旅行和运动。
阅读扩展了我的视野,旅行让我能够体验不同的文化和风景,而运动则让我保持健康和积极的精神状态。
此外,我也很喜欢与家人和朋友相处,分享彼此的喜怒哀乐。
总的来说,我是一个热情、乐观、有责任心的人。
我相信勤奋和坚持可以取得成功,而真诚和善良可以赢得他人的信任和支持。
我希望能够在您的团队中发挥我的才能,并与大家一同成长和进步。
这就是我简单的自我介绍,谢谢大家!。
马的遍历问题

学院《数据结构与算法》课程设计报告书课程设计题目马的遍历问题院系名称计算机科学与技术系专业(班级)姓名(学号)指导教师完成时间一、问题分析和任务定义:国际象棋中马采用“日”字走法,对棋盘上马所在的结点,一步内到达的结点最多有八个,即假设马所在点的坐标为(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)把这些点看作马所在点的邻接点,所以可以采用类似图的深度优先遍历,以马所在点为初始点对整个棋盘进行遍历。
然后按遍历的顺序输出结点棋盘的规格限制为8*8,输入数据为起始点的位置(0-7)。
输出数据为可以遍历成功的若干方案(本程序设置为至多八种)。
因为对图形学完全不了解,所以我没有动态显示,而是采取直接输出结果的策略。
二、概要设计和数据结构的选择:1.解决马的遍历问题,可以用一个二维数组board[][]来表示棋盘,一开始用来存放步骤号,若走过了则把它赋值为1。
另对马的8种可能走法设定一个顺序,如当前位置在棋盘的(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),实际可以走的位置尽限于还未走过的和不越出边界的那些位置。
为便于程序的同意处理,可以引入两个数组mover[]、movec[],分别存储各种可能走法对当前位置的纵横增量。
整形变量step存放步骤号,start存放遍历次数,在numable函数和number函数中的语句k=(i+start)%N;中是用于定位,保证不会超过棋盘范围和八次遍历都不会走同样的路径test存放遍历成功次数。
在8×8方格的棋盘上,从任意指定的方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。
数据结构实习报告——国际象棋中马的遍历

数据结构与VC编程实习实习报告学生姓名:学号:专业班级:指导教师:2012年7月14日实习题目在国际象棋棋盘上实现马的遍历一、任务描述及要求国际象棋的棋盘有8×8=64个格子,给它们规定坐标(1,1)到(8,8)。
马在这64个格子的某一个格子上,它的跳动规则是:如果它现在在(x,y)位置,它下一步可以跳到(x±1,y±2)或(x±2,y±1)(所有的“±”之间没有相关性)。
一般来说它下一步可以有八种跳法,但是它不能跳出这64个格子。
设计算法使它不管从哪出发都可以跳遍所有的格子(每个格子只能路过一次)最后回到起点。
1.基本要求:合理设计界面,自行设计国际象棋棋盘,用鼠标选择马的起始位置,起始位置选定后,按“开始”按钮演示马的每一步行走路线。
棋盘和马的显示尽量美观逼真。
功能菜单或按钮自行设计,以合理为目的。
2.扩展要求:对算法进行优化,根据j.c.Warnsdorff规则设计算法,该规则是在所有可跳的方格中,马只可能走这样一个方格:从该方格出发,马能跳的方格数为最少;如果可跳的方格数相等,则从当前位置看,方格序号小的优先。
二、概要设计1.抽象数据类型本次实习中,我主要采用图的深度遍历知识和贪心算法来解决在国际象棋棋盘上实现马的遍历问题。
棋盘上将64个格子视为64个点,将马从一个格子跳到另一个格子视为一条边,则共有168条边,那么可以将棋盘视为一个无向图,马在棋盘上按c.Warnsdorff规则跳动可视为图的深度遍历过程中的一步。
为了实现图的存储,需要建立顶点顺序表和邻接表,这个过程是在图的构造函数里实现的。
图的操作主要包括:给出顶点vertex在表中的位置,给出顶点位置为 v 的第一个邻接顶点的位置,给出顶点v的邻接顶点w的下一个邻接顶点的位置,给出顶点位置为 v 的最优邻接顶点的位置。
图的遍历算法是在视图类里面实现的。
图的抽象数据类型为:ADT Graph{数据:顶点顺序表关系: 邻接表表示了顶点之间的邻接关系操作:①给出顶点vertex在表中的位置②给出顶点位置为 v 的第一个邻接顶点的位置③给出顶点v的邻接顶点w的下一个邻接顶点的位置④给出顶点位置为 v 的最优邻接顶点的位置}由于贪心算法有时不能得到整体最优解,所以我设计了另一种遍历算法。
马的遍历问题(C++实现)
课程设计报告课程名称:题目:院系:专业:班级:学号:姓名:时间:目录一、需求分析 (2)1.问题描述: (2)2.基本要求 (2)二、概要设计 (2)1.数据结构 (2)2.程序模块 (3)三、详细设计 (4)四、调试分析 (9)五、用户手册 (9)六、测试结果 (10)七、参考文献 (13)棋盘求解题目:设计程序完成如下要求:在中国象棋棋盘上,对任一位置上放置的一个马,均能选择一个合适的路线,使得该棋子能按象棋的规则不重复地走过棋盘上的每一位置。
要求依次输出所走过的各位置的坐标。
一、需求分析1. 问题描述:中国象棋是10*9的棋盘,马的走法是“马走日”,这里忽略“蹩脚马”的情况,使马的遍历的问题简单化。
马在棋盘上遍历采用算法当中的深度优先算法和回溯法:回溯法是一种不断试探且及时纠正错误的搜索方法。
从入口出发,按某一个方向向前探索,若能走通并且未走过,即某处可以到达,则到达新点,否则试探下一方向;如果发生“阻塞”的情况,就是后面走不通的情况,则沿原路返回前一点,换下一个方向再继续试探,直到找到一条通路,或无路可走又返回到入口点。
在寻找下一步的时候,对周围的这几个点进行比较,从而分出优劣程度,即看它们周围可以走的点谁最少,然后就走那条可走路线最少的那条。
经过这样的筛选后,就会为后面的路径寻找提供方便,从而减少回溯次数。
棋盘中马的遍历采用数组进行存储,同时因为有回溯,所以采用栈的方法,并且为了最后打印方便,采用的是顺序栈的方法。
同时还有八个方向的数组,和为栈设计的每个点周围的八个方向那些可以走的数组。
2. 基本要求棋盘有10行9列,利用chess来表示一个棋盘,chess[i][j]=0或1;其中:0表示通路,1表示不通,当从某点向下试探时,中间点的8个方向可以试探;棋盘采用数组形式,并且这里的数组比棋盘的数组规模稍大,因为为了保证边缘点也有八个方向可以走,使问题能够简单化,不用再判断当前点的试探方向有几个。
马的遍历
安徽工业大学《数据结构》课程设计实验报告——马的遍历问题学院:计算机学院班级:软件093班姓名:胡兴凯指导老师:汤亚玲设计时间:2011.6.15—2011.6.20马的遍历问题目录1.问题描述: (2)2.设计思路: (2)3.数据结构设计: (2)4.功能函数设计: (3)5.编码实现: (4)6.运行和测试: (9)马的遍历问题1.问题描述:在中国象棋(10*9)和国际象棋(8*8)的棋盘的任意位置上放一个马,然后按照“马走日”的走法,在没有蹩马脚的限制下,选择一个合适的路线,使得棋子能够不重复的走完棋盘上的每一步。
试设计这样一个算法,能够实现这样的功能,并且能够打印出走过的正确路径。
2.设计思路:这个题目采用的是算法当中的深度优先算法和回溯法:在“走到”一个位置后要寻找下一个位置,如果发生“阻塞”的情况,就是后面走不通的情况,则向后回溯,重新寻找。
但是如果只是单纯的这样简单寻找的话,造成的结果很可能是机器没有提示错误,但是CPU运行率高达50%,因为要尝试超过1万亿种路线,普通的计算机难以实现这样巨大的运算量。
所以这种方法有待改进。
改进后的方法思想基本类似,但是回溯量大大减少,有时甚至不用回溯都可以完成。
它的精华在于寻找下一步的时候,不是单纯的在周围的八个方向中按照既定的顺序找到一个可以走的点就结束;而是对周围的这几个点进行比较,从而分出优劣程度,即看它们周围可以走的点谁最少,然后就走那条可走路线最少的那条。
进过这样的筛选后,就会为后面的路径寻找提供方便,从而减少回溯次数。
本程序的棋盘和数组类似,因而采用数组进行存储,同时因为有回溯,所以采用栈的方法,并且为了最后打印方便,采用的是顺序栈的方法。
同时还有八个方向的数组,和为栈设计的每个点周围的八个方向那些可以走的数组。
3.数据结构设计:同上面述,棋盘采用数组形式,并且这里的数组比棋盘的数组规模稍大,因为为了判断的方便,这里在棋盘周围个加了两层“墙”。
数据结构课程设计
数据结构课程设计题目马的遍历问题系 (部) 电子与信息工程系班级 15级计算机科学与技术姓名白天宇学号 2015022020 指导教师付争方2016年06月20日电子与信息工程系课程设计任务书计算机教研室制2015022020 白天宇马的遍历问题白天宇安康学院计算机科学与技术15级陕西省安康市725000摘要:中国象棋中马采用“日”字走法,对棋盘上马所在的结点,一步内到达的结点最多有八个,即假设马所在点的坐标为(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 问题分析和任务定义中国象棋中马采用“日”字走法,对棋盘上马所在的结点,一步内到达的结点最多有八个,即假设马所在点的坐标为(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)把这些点看作马所在点的邻接点,所以可以采用类似图的深度优先遍历,以马所在点为初始点对整个棋盘进行遍历。
然后按遍历的顺序输出结点可以用一个二维数组chess[][]来表示棋盘,一开始用来存放步骤号,若走过了则把它赋值为0。
对于动态演示问题,只要在“马”的位置显示“马”,已经走过的位置显示“●”,未走过的位置显示“┌”“┬”“┐”“├”等制表符,然后清屏,显示下一步,再清屏,依次类推。
棋盘的规格限制在20*20以内,起始点当然不能超出棋盘的范围,每输入一组数据,首先判断是否可以全部走完,如果可以,则动态演示,否则重新输入数据。
2 概要设计和数据结构的选择该算法需要定义一个二维数组chess[][]用来表示棋盘,整形变量step存放步骤号,count存放运算次数。
国际象棋马走满棋盘不重复
为实现上述功能需要一个顺序的栈存储每一步,以及一个模拟马踏棋盘过程的模块。为 此需要两个抽象数据类型,即栈和马踏棋盘.
1.对栈的抽象数据定义为:
void InitStack(SqStack &S);
//构造一个空栈S
bool GetTop(SqStack &S,XY &e); //若栈不空,则用e返回s的栈顶元素,返回OK;
}
(*S.top).x=e.x;
//把 e 压入栈
(*S.top).y=e.y;
(*S.top).p=e.p;
S.top++;
}
bool Pop(SqStack &S){
if (S.top == S.base) return false;
//如果空栈返回 false
--S.top;
//删除栈顶元素
return true;
printf("
*程序说明:
*\n"); printf(" printf("
* 8X8 的国际棋盘 * 输入两个数字作为马的初始位置
*\n");
*\n"); printf(" printf("
* 输入数据必须在 0~7 之间 * 程序将给出马的遍历行走路线
*\n");
*\n"); printf("
* 路线以步数形式给出
*\n"); printf("
********************************计算机 2 班 16 组
*******\n\n"); printf("输入初始位置开始程序:");
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告题目:马踏棋盘学院计算机专业计算机科学与技术年级班别2009级2班学号 **********学生姓名黄丽敏指导教师吴伟民成绩____________________2011年7月一、【问题描述】设计一个国际象棋的马踏棋盘的演示过程。
基本要求:将马随机放在国际象棋的8*8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动,要求每个方格只进行一次,走遍整个棋盘的全部64个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8*8的方阵,输出之。
测试数据:可自行制定一个马的初始位置(i ,j ),0<=I,j<=7。
二、【实验目的】1、对数据结构基本理论和存储结构及算法设计有更深入的理解;2、了解栈的特性,以便在实际问题背景下灵活运用他们;3、提高在世纪设计操作中系统分析、结构确定、算法选择、数学建模和信息加工的能力。
三、【设计过程】第1步:实现提示 一般来说,当马位于位置(i,j )时, 可以走到下列8个位置之一: (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 )靠近棋盘的边缘,上述有些位置可能要超出棋盘位置,成为不允许的位置。
8个可能位置可以用一位数组HTry1[0…7]和HTry2[0…7]来表示:0 1 2 3 4 5 6 7 -2 -1 1 2 2 1 -1 -2 1221-1-2-2-1(表-2)位于(i ,j )的马可以走到新位置是在棋盘范围内的(i+HTry1[h],j+HTry2[h]),其中h=0…7。
8 1 7 2 6 3 5 4第2步:需求分析(1)输入的形式和输入值的范围:输入马的初始行坐标X和列坐标Y,X和Y的范围都是[1,8]。
(2)输出形式:以数组下表的形式输入,i为行标,j为列标,用空格符号隔开。
以棋盘形式输出,每一格打印马走的步数,这种方式比较直观(3)程序所能达到的功能:让马从任意起点出发都能够遍历整个8*8的棋盘。
(4)测试数据,包括正确输入及输出结果和含有错误的输入及其输出结果。
数据可以任定,只要1<=x,y<=8就可以了。
正确的输出结果为一个二维数组,每个元素的值表示马行走的第几步,若输入有错,则程序会显示:“输入有误!请重新输入……”并且要求用户重新输入数据,直至输入正确为止。
第3步,算法设计思想:1、输入马所在初始位置的坐标值,考虑到用户的输入习惯,此处1<=x,y<=8;2、将输入的初始值进栈;3、设置一个while循环,循环条件为count<64;4、取出栈顶元素;5、定义flag标志变量的值;6、按照SetRound函数逆时针顺序优先原则,找栈顶元素周围未被占用的7、新位置。
若存在该位置,则令order的值等于该新位置的坐标,并入栈;8、否则弹出栈顶元素;9、再次回到第③步while循环进行判断;10、输出一个8*8的方阵,所示数字即为相应步骤。
第4步,算法框图:第5步,存储结构设计:(1)、位置的存储表示方式typedef struct{int x;int y;int from;}Point;(2)、栈的存储方式#define STACKSIZE 70#define STACKINCREASE 10typedef struct Stack{Point *top;Point *base;int stacksize;};第6步,设计功能分析与实现(1)、设定栈的抽象数据类型定义:ADT Stack {数据对象:D={a i | a i∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<a i-1 , a i>|a i-1, a i∈D,i=2,…,n}约定a n端为栈顶,a i端为栈顶。
基本操作:InitStack(&s)操作结果:构造一个空栈s,DestroyStack(&s)初始条件:栈s已存在。
操作结果:栈s被销毁。
ClearStack(&s)初始条件:栈s已存在。
操作结果:栈s清为空栈。
StackEmpty(&s)初始条件:栈s已存在。
操作结果:若栈s为空栈,则返回TRUE,否则返回FALSE。
StackLength(s);初始条件:栈s存在。
操作结果:返回s的元素个数,即栈的长度。
GetTop (s,&e);初始条件:栈s已存在且非空。
操作结果:用e返回s的栈顶元素。
Push(&s,e)初始条件:栈s已存在。
操作结果:插入元素e为新的栈顶元素。
Pop(&s,&e)初始条件:栈s存在且非空。
操作结果:删除栈顶元素,并用e返回。
stackTraverse(s,visit())初始条件:栈s存在且非空。
操作结果:从栈底到栈顶依次对s的每个元素调用visit()。
一旦visit()失败,则操作失败。
}ADT Stack(2)、选取对该程序有用的函数。
1、InitStack(&s)用于构建空栈实现相应的操作;2、StackEmpty(&s)用于判断空栈情况,已确保循环体能够准确实现;3、GetTop (s,&e)用于取放入栈的栈顶元素,实现把放入的横纵坐标按要求取出;4、Push(&s,e)用于将用户输入的横纵坐标放入栈;5、Pop(&s,&e)用于实现将要求取出的元素取出;(3)、主要函数及算法说明。
1、函数:void SetRound(Point cur)参数:Point cur功能:找出当前位置下一步的八个位置,将其赋给g_round[8];算法:接受参数传来的值,按逆时针次序加上g_round[i].x={-2,-1,1,2,2,1,-1,-2};g_round[i].y={1,2,2,1,-1,-2,-2,-1};再根据GetRound函数来判断是否合法;若合法则返回TRUE,否则返回FALSE.2、函数:Status GetRound(int i,Point &pt)参数:int i,Point &pt功能:将所在位置周围八个位置坐标赋予指针变量,并判断其合理性;算法:用以下赋值语句pt.x=g_round[i-1].x;pt.y=g_round[i-1].y;将现在周围8个指定位置赋予指针变量pt,并用if(pt.x<0||pt.y<0||pt.x>7||pt.y>7)条件语句判断其合理性,若合理则返回TRUE,否则返回FALSE.3、语句:for(int i=cur.from+1;i<=8;i++){if(GetRound(i,next)&&erder[next.x][next.y]==0){语句……}}功能:按照逆时针优先规则,选出下一个可用的位置,通过if判断语句来判断所选的下一步是否可用,若可用,则使其进栈,否则运行下面一个语句。
4、语句:if(!flag){语句…..while(j<p && GetDeep(herseVisit)>1){语句…..}}功能:如果当前位置不存在任何新路径,则根据while循环进行退栈,直至退到存在有最佳位置的坐标。
蛋必须保证栈不为空。
所以此出栈中设定了intGetDeep的基本操作,就是防止空栈还继续弹东西出来的情况发生。
四、【调试程序】(1)、问题:语法错误原因:首次运行语法错误比较多,一般都是由于粗心大意输入有误造成的,还有一些错误属于变量忘记定义之类的,经过认真一个一个调试后这类错误得以解决。
下图为第一次运行时的错误(2)、问题:运行后突然停止程序原因:可能是输出不恰当解决:此问题出现后,刚开始不知道为啥,看了很多遍程序就是找不出原由,于是后来请教同学,一起研究后无意中改了输出格式,将printf("%s,%2d ",'|',order[i][j]);改成了printf("%d,%f ",order[i][j],'|');竟然成功输出了。
怀疑是%s使用得不恰当。
下图为修改前的运行结果:(3)、问题:将上述问题解决后虽然不会出现程序突然终止的情况,但运行结果如下图,输出结果很乱;原因:输出格式不符解决:将printf("%d,%f ",order[i][j],'|');改成printf("| %2d ",order[i][j]);(4)、问题:上述问题都搞定后,输入初始坐标后按下Enter键后立即退出了原因:main()函数里有scanf(),当用户输入初始坐标后,将这两个坐标赋予给&begin.x,&begin.y,结果当用户想用Enter键进行确认操作后,Enter本身是一个字符,而这个字符不符合循环要求,所以直接退出解决:多加一个getchar()把Enter键给吸收掉,结果如下图:五、【用户手册】(1)、用户界面,如下图:(2)、按照提示,输入1 2进行数据测试,如下图:(3)、输入y则继续回到主界面,如果输入n则退出系统,如下图:(4)、若在主界面输入x和y不在确定范围,或者输入格式不正确,出现如下图:六、【实验总结与体会】总结:马踏棋盘,作为一种经典的栈的应用例子,从大方面将,刚看到这名字就知道用栈来实现,但是,当你面对这个题目,打开编译器之后想写的时候,发现又不是那么容易,很多细节需要认真的分析,比如结构体的定义,棋子因为是二维的,所以对于用来存储棋盘的横纵坐标,需要用到两个变量,定义两整型变量x,y。
刚开始只定义了这两个变量,后来发现如果找到下一个位置,而下一个位置有很多个都是符合的,如何选取最优的呢?最有的有可能是最先找到的,可找到后还得继续找下去,万一没有比他更优的,则要退回来,如果没有变量from来记录前一位置最优位置,就无法找到之前的点,所以要多加一个变量;其外就是程序的调试,调试确实需要很大的耐心,有时候只是你的大意而输错了字符或输入输出格式不符合就会出现很多看起来不可思议很难发现的错误,这也说明了编程的时候一定要认真有耐心。
体会:刚学习栈的时候,觉得并不太难,反正就是先进后出,可是到了实际运用的时候,才发现学到的理论知识要用到实际去还真是个问题,通过这次课程设计的实践,让我对栈有了更深入的理解,也发现一种理论再简单的知识,如果不实际运用一下,对于你的掌握肯定是不够的,因为实际运用中你要适当选取哪些是有用的,哪些不必用到的,而且当你很兴奋的写完代码后,会发现很多错误,当然一般是语法错误,如果你的逻辑没错的话,也有可能是你思想没错,但你的表达不妥当,这也会让你对程序的修改显得很无助;再次,世上没有完美的程序,如今社会上出现的各个软件每到一定的时候就会有升级版也正是这个原因,我承认自己这个程序存在很多漏洞和不足,但一个程序的优化可不是一朝一夕的事,只要求自己能完成基本任务就行了。