免费预览已结束,剩余7页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计实验报告马的遍历学院:长江学院班级:093212学号:09321225姓名:杨海龙指导老师:刘自强指导时间:2010.12.2810目录1.流程图:12.问题描述:23.设计思路:24.数据结构设计:25.功能函数算法分析:3(1)计算一个点周围有几个点函数int Count(int x,int y)3(2)寻找下一个方向函数int Find_Direction(int x,int y)3(3)栈的相关函数:4(4)骑士遍历函数:void Knight(int x,int y,int v)5(5)主函数:void main()6(6)棋盘初始化函数void Mark_Che(int v)7(7)标记初始化函数void Mark_Dir(int v)86.运行和测试:87.心得体会:10马的遍历问题开始输入入口点横坐标横坐标在110之间输入入口点纵坐标纵坐标在19之间显示骑士遍历路径结束1.流程图: 假 真 假 真2.问题描述:在中国象棋棋盘上,对任意位置上放置的一个马,均能选择一个合适的路线,使得该棋子(马)能按象棋的规则不重复的走过棋盘上的每一个位置。要求依次输出所有走过的各位置的坐标。3.设计思路:首先,中国象棋是10*9的棋盘,马的走法是“马走日”,忽略“蹩脚马”的情况。其次,这个题目采用的是算法当中的深度优先算法和回溯法:在“走到”一个位置后要寻找下一个位置,如果发生“阻塞”的情况,就是后面走不通的情况,则向后回溯,重新寻找。在寻找下一步的时候,对周围的这几个点进行比较,从而分出优劣程度,即看它们周围可以走的点谁最少,然后就走那条可走路线最少的那条。经过这样的筛选后,就会为后面的路径寻找提供方便,从而减少回溯次数。最后,本程序的棋盘和数组类似,因而采用数组进行存储,同时因为有回溯,所以采用栈的方法,并且为了最后打印方便,采用的是顺序栈的方法。同时还有八个方向的数组,和为栈设计的每个点周围的八个方向那些可以走的数组。4.数据结构设计:同上面述,棋盘采用数组形式,并且这里的数组比棋盘的数组规模稍大,因为为了判断的方便,这里在棋盘周围各加了两层“墙”。具体数据结构定义如下:int chessboard1413; /采用最大的中国象棋10*9制的int CanPass14138; /每个棋子的八个方向哪些可以走typedef struct /棋盘的八个方向 int y; int x;direction;direction dir8=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 structpathnode pa90; /栈的容量最大为90int top; /栈顶path; /顺序栈5.功能函数算法分析:(1)计算一个点周围有几个点函数int Count(int x,int y)该函数实现的功能是在遍历的过程当中计算一个点周围有几个方向可以走,从而为后面的筛选提供依据。时间复杂度为int Count(int x,int y) /计算每个节点周围有几个方向可以走int count=0,i=0;for(i=0;i8;i+)if(chessboardx+1+diri.xy+1+diri.y=0)count+;return count;(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;direcount) min=count; d=dire; if(dtop=-1;int Push_Path(path *p,pathnode t,int v) /压节点及其向下一位移动的方向入栈if(p-top=63+26*v)return -1;elsep-top+;p-pap-top.x=t.x;p-pap-top.y=t.y;p-pap-top.di=t.di;return 1;int Empty(path p) /判断栈是否为空if(p.topx=p-pap-top.x;t-y=p-pap-top.y;t-di=p-pap-top-.di;return 1;(4)骑士遍历函数:void Knight(int x,int y,int v)这是该算法的精华部分,x,y表示入口地点,v表示棋盘类型即中国象棋,这个函数主体是一个循环,循环里面始终是在找下一个点,如果找到就将该点进栈,找不到则退栈。直到发生栈为空时退栈或循环结束,前一种情况时会提示找不到路径(虽然不会发生,但是为逻辑严密性依然要如此),后一种情况则打印出走过的正确路径和走过之后的数组,时间复杂度为。void Knight(int x,int y,int v) /x,y表示出发位置 /骑士遍历函数int num=1,t,i;path p;pathnode f;Init_Path(&p);for(num=1;num=64+26*v;num+)t=Find_Direction(x,y);if(t!=-1) /正常找到下一个方向的情况下chessboardx+1y+1=num;f.x=x;f.y=y;f.di=t;Push_Path(&p,f,v);x=x+dirt.x;y=y+dirt.y;else if(num=64+26*v&chessboardx+1y+1=0) /最后一次时t肯定是-1chessboardx+1y+1=num;f.x=x;f.y=y;f.di=t;Push_Path(&p,f,v);elseif(Pop_Path(&p,&f)=-1) /出栈且栈为空的情况printf(!无法为您找到一条适合的路径!n);exit(0);num-=2;x=f.x;y=f.y;CanPassx+1y+1f.di=1; /end else /根据栈中信息打印出骑士行走路径printf(骑士巡游路径如下:n );for(i=0;i,p.pai.x,p.pai.y);if(i+1)%(8+v)=0)printf(bb n-);printf(bb n);(5)主函数:void main()提示输入起点位置,这里的起点位置就是日常生活观念中的顺序,开始点是(1,1),而不是数组中的初始位置(0,0),输入错误则提示重新输入,时间复杂度为。void main() /主函数int x,y,v; char ch=y; while(ch=y)printf(中国象棋马的遍历n:);Mark_Che(v);Mark_Dir(v);while(1)printf(请输入入口点横坐标:);scanf(%d,&x);if(x8+2*v)printf(输入错误,请重新输入!(横坐标在1-%d之间)n,8+2*v);elsebreak;while(1)printf(请输入入口点纵坐标:);scanf(%d,&y);if(y8+v)printf(输入错误,请重新输入!(纵坐标在1-%d之间)n,8+v);elsebreak;Knight(x,y,v);printf(是否继续?继续:y;); fflush(stdin);scanf(%c,&ch);(6)棋盘初始化函数void Mark_Che(int v)此函数作为棋盘初始化函数,因为每次执行程序时,棋盘上必须是全部都没有走过的。它会自动进行初始化棋盘,在14*13的棋盘上初始化。初始化后,棋盘大小的区域全部是0,而周围的两堵墙标志为1,时间复杂度为。void Mark_Che(int v) /标志棋盘函数int i,j;for(i=0;i12+2*v;i+) /首先全部标记为0for(j=0;j12+v;j+)chessboardij=0;for(i=0;i2;i+) /前面两行标记为1for(j=0;j12+v;j+)chessboardij=1;for(j=0;j2;j+) /前面两列标记为1for(i=0;i12+2*v;i+)chessboardij=1;for(j=10+v;j12+v;j+) /后面两列标记为1for(i=0;i12+2*v;i+)chessboardij=1;for(i=10+2*v;i12+2*v;i+)for(j=0;j12+v;j+) /后面两行标记为1chessboardij=1;(7)标记初始化函数void Mark_Dir(int v) 此函数和上面的函数功能类似,也是初始化才用,它是为栈的实现提供帮助的。开始时全部标记为0,表示周围的八个方向都可以走,时间复杂度为。void Mark_Dir(int v) /由于三维数组赋初值比较困难,因而采用单独的函数实现int i,j,k;for(i=0;i12+2*v;i+)for(j=0;j12+v;j+)for(k=0;k8;k+)CanPassijk=0;6.运行和测试:程序运行开始时,提示用户输入入口横坐标,输入0,提示“输入错误,请重新输入!(横坐标在1-10之间)”;再次输入1,提示输入纵坐标,输入10,提示“输入错误,请重新输入!(纵坐标在1-9之间)”,再次输入2;出现结果,显示坐标形式;运行结果如下图示:7.心得体会:从这周的上机实践中,我体会到上机的重要性。编写程序,离不开上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新形势下子宫镜行业顺势崛起战略制定与实施分析研究报告
- 2025-2030年中医经络智能检测设备企业制定与实施新质生产力战略分析研究报告
- 2025-2030年玩具、游艺用品及乐器超市行业市场营销创新战略制定与实施分析研究报告
- 合工大电路试题及答案
- 2025年天津市南开区中考二模道德与法治试卷及答案(含解析)
- 护理学三基试题及答案
- 2026年电工初级实操考核模拟题
- 8.家庭养鸡说课稿2025学年小学综合实践活动皖教版六年级下册-皖教版
- 初中阅读习惯2025年习惯养成说课稿设计
- 2026年小学生防食物中毒安全知识
- 2026中国铁塔夏季校园招聘备考题库附答案详解(轻巧夺冠)
- 2025年软考《数据库系统工程师》考试试题及答案
- 服装系毕业设计
- 2026四川自贡高新国有资本投资运营集团有限公司招聘9人备考题库含答案详解(综合卷)
- 2026年银行金融基础知识复习通关试题库带答案详解(完整版)
- 2025年深圳市龙岗区网格员招聘考试试题及答案解析
- 五年级下册道德与法治材料分析专项练习题
- 比亚迪供应商质量管理手册
- 舞蹈类创新创业
- 水法知识讲座课件
- 智能医学检验:AI自动化结果解读与质控
评论
0/150
提交评论