马踏棋盘c++课程设计

合集下载

马踏棋盘c语言课程设计

马踏棋盘c语言课程设计

马踏棋盘c语言课程设计一、教学目标本课程的目标是让学生掌握C语言的基本语法、数据结构、算法和编程技巧,培养学生独立思考、解决问题和合作交流的能力。

具体分为以下三个部分:1.知识目标:学生能够理解并掌握C语言的基本语法、数据类型、运算符、控制结构、函数、数组、指针等概念,了解C语言的面向对象编程思想。

2.技能目标:学生能够运用C语言编写简单的程序,解决实际问题,具备一定的编程能力。

3.情感态度价值观目标:培养学生对计算机科学的兴趣,增强自信心,培养克服困难的勇气和团队协作精神。

二、教学内容教学内容主要包括C语言的基本语法、数据结构、算法和编程技巧。

具体安排如下:1.第一章:C语言概述,介绍C语言的发展历程、特点和基本语法。

2.第二章:数据类型和运算符,讲解整型、浮点型、字符型数据以及各类运算符的用法。

3.第三章:控制结构,包括条件语句、循环语句和跳转语句。

4.第四章:函数,讲解函数的定义、声明、调用以及函数的参数传递。

5.第五章:数组和指针,介绍数组的声明、初始化和使用,以及指针的基本概念和应用。

6.第六章:字符串和文件操作,讲解字符串的表示、操作方法以及文件读写。

7.第七章:编程实践,通过实际项目让学生综合运用所学知识解决实际问题。

三、教学方法本课程采用多种教学方法,包括讲授法、案例分析法、实验法和讨论法。

1.讲授法:用于讲解C语言的基本语法、数据结构和算法。

2.案例分析法:通过分析实际项目,让学生了解C语言在实际中的应用。

3.实验法:让学生动手编写程序,培养实际编程能力。

4.讨论法:鼓励学生提问、交流和分享,培养合作交流能力。

四、教学资源1.教材:《C程序设计语言》(K&R)或《C Primer Plus》。

2.参考书:《C语言编程之美》、《C语言深度剖析》。

3.多媒体资料:PPT课件、教学视频、在线教程。

4.实验设备:计算机、编程环境(如Code::Blocks、Visual Studio等)。

数据结构 马踏棋盘 设计报告

数据结构 马踏棋盘 设计报告

《数据结构》课程设计报告课程名称:《数据结构》课程设计课程设计题目:姓名:院系:专业:年级:学号:指导教师:2011年月日目录1、程序设计的目的2、设计题目3、分析4、设计思想5、算法6、测试结果7、调试分析8、小结1、课程设计的目的1、熟练使用C++语言编写程序,解决实际问题;2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;5、学习并熟悉栈的有关操作;6、利用栈实现实际问题;2、设计题目【马踏棋盘】*问题描述:将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走棋规则进行移动。

要求每个方格上只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。

*测试数据:由读者指定,可自行指定一个马的初始位置。

*实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

3、分析确定输入值的范围,输入马的初始行坐标X和Y,X和Y的范围都是1到8之间。

程序的功能是输出马走的步骤,要使马从任一起点出发,通过程序能找到下一个地点,然后遍历整个棋盘。

每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

输出时可以用二维数组。

4、设计思想输入马初始位置的坐标。

将初始位置进栈,经过一个while循环,取出符合条件的栈顶元素。

利用函数,找出栈顶元素周围未被占用的新位置,如果有,新位置入栈;否则弹出栈顶元素。

C++ 数据结构课程设计 马踏棋局文档

C++ 数据结构课程设计 马踏棋局文档

课程设计题目1 问题描述将马随机放在国际象棋的8*8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动,要求每个方格上只进入一次,走遍棋盘上全部64个方格2 基本要求(1)采用图形界面实现该游戏。

(2)从键盘输入马的初始位置。

(3)编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8* 8的方阵,并输出之。

3系统分析与设计3.1 数据结构逻辑结构为线性结构,用顺序栈。

坐标点用已结构体来表示,并将其的位置放在s[step]的栈中,而且将每走一步的坐标放在另一栈s1中3.2 算法设计1.程序框架及功能模块划分:2.设计功能的分析与实现void exit(point p)参数:point功能:计算出下一步可能位置,按其各个位置下一个位置的和压栈到s[]中算法描述:接受参数传来的值,按次序加上int horizontal[]={2,1,-1,-2,-2,-1,1,2};int vertical[]={-1,-2,-2,-1,1,2,2,1};再根据legal函数来判断是否合法(x(0~7),y(0~7))是,则保存在point ap[]中,再按各自下一步的数目从大到小排序。

最后,将ap[]中的点压栈。

int number(point p)参数:point功能:找出当前位置下一步的各种可能位置,计算可能之和算法描述:接受参数传来的值,按次序加上int horizontal[]={2,1,-1,-2,-2,-1,1,2};int vertical[]={-1,-2,-2,-1,1,2,2,1};再根据legal函数来判断是否合法(x(0~7),y(0~7))是,则加1并将值返回void next(point p)参数:point功能:/找出各个位置并将其步数记录算法描述:将其步数记录在board[][]的相应位置,并将这点压栈到s1,判断步数是否小于64,再根据这四个条件选择执行其中的一个,再递归调用next.bool legal(point p)参数:point功能:判断是否可行,合法(是否在棋盘上,是否走过)算法描述:用这样的语句if((p.x>=0)&&(p.x<n)&&(p.y<n)&&(p.y>=0)&&(bo ard[p.x][p.y]==0))return true;elsereturn false;4 测试数据及结果测试数据和运行输出及结果分析输入x(0-7),y(0-7)0 01 34 3 18 49 32 13 164 19 56 33 14 17 50 3157 2 35 48 55 52 15 1220 5 60 53 36 47 30 5141 58 37 46 61 54 11 266 21 42 59 38 27 64 2943 40 23 8 45 62 25 1022 7 44 39 24 9 28 63 Press any key to continue输入x(0-7),y(0-7)0 9输入不合法,重输入!输入x(0-7!),y(0-7!)4 530 27 10 49 40 25 8 511 48 29 26 9 6 39 2428 31 56 45 50 41 4 747 12 51 42 19 44 23 3832 57 46 55 52 1 18 313 64 53 60 43 20 37 2258 33 62 15 54 35 2 1763 14 59 34 61 16 21 36 Press any key to continue5 总结调试过程中遇到的主要问题,是如何解决的;问题1:只走到63步原因:第64步就走完了,并且s[62]中只有一个元素,这个判断条件(s[step].base==s[step].top&&number(p2)==0)满足就进入了,而始终不能走完解决方法:改了判断条件,改为((s[step].base==s[step].top&&number(p2)==0)&&step!=n* n-1)解决方案:用InitStack(s1)初始化问题3:冒泡排序超出边界原因:循环次数大解决方案:减少循环次数看了其他同学,都差不多,我已经按马的下一位置最难的先走,再走难度次之的位置。

c语言程序课程设计棋盘

c语言程序课程设计棋盘

c语言程序课程设计棋盘一、课程目标知识目标:1. 让学生掌握C语言中的数组知识,并能运用数组创建和操作棋盘。

2. 理解和掌握循环结构在棋盘程序中的应用,如嵌套循环用于遍历棋盘。

3. 学习使用函数对棋盘程序进行模块化设计,理解模块间的关系和调用方式。

技能目标:4. 能够编写简单的C语言程序,实现基本的棋盘游戏逻辑,例如棋子的移动、位置的判断等。

5. 培养学生的逻辑思维能力,通过编程解决棋盘游戏中遇到的问题。

6. 提高学生的问题分析能力,使其能够通过算法设计处理棋盘游戏中的特定问题。

情感态度价值观目标:7. 培养学生对编程和算法设计的兴趣,激发学生在信息技术领域的探究欲望。

8. 强调团队协作的重要性,通过小组合作完成棋盘程序的设计,培养学生的沟通和团队协作能力。

9. 培养学生的创新意识,鼓励学生提出和实现独特的棋盘游戏规则和功能。

课程性质:本课程设计以实践性为主,结合理论知识的讲解,注重培养学生的实际操作能力和编程思维。

学生特点:考虑到学生为高中年级,具备一定的逻辑思维能力和问题解决能力,但编程经验可能有限。

教学要求:通过棋盘程序的设计,将复杂问题分解为若干个小问题,引导学生循序渐进地掌握C语言编程和应用,同时注重激发学生的学习兴趣和创新能力。

教学过程中应注重个体差异,提供个性化的指导和反馈,确保每位学生都能实现既定的学习目标。

二、教学内容本节教学内容围绕C语言程序设计,结合棋盘游戏项目,主要包括以下部分:1. C语言基础知识回顾:数组的使用、数据类型、变量声明与赋值。

- 教材章节:第3章 数组和第5章 数据类型与表达式。

2. 控制结构:循环结构的使用,重点讲解嵌套循环在棋盘遍历中的应用。

- 教材章节:第4章 控制结构。

3. 函数与模块化设计:介绍如何将棋盘程序拆分为函数模块,实现代码复用和模块化。

- 教材章节:第6章 函数。

4. 棋盘程序设计:a. 棋盘的初始化:创建二维数组表示棋盘,并进行初始化。

马踏棋盘数据结构报告参考模板

马踏棋盘数据结构报告参考模板

《数据结构》课程设计报告课程设计题目:马踏棋盘姓名:张程浩院系:通信工程专业:信息安全年级:2011学号:11225104指导教师:任雪萍2012年11 月26 日(任雪萍编写)目录一、课程设计目的 (3)二、任务分析 (3)三、分析设计 (3)四、调试分析 (5)五、测试结果 (5)六、小结 (6)七、用户手册 (6)八、附录 (6)九、参考文献 (8)一、课程设计目的(1)熟练使用C语言编写程序,强化模块设计理念;(2)设计一个国际象棋马踏棋盘的演示程序。

(3)理解栈的特性“后进先出”和队列的特性“先进先出”。

(4)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;二、任务分析(1)要求:在国际象棋8×8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。

编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,并输出它的行走路线。

(2)输入:任意一个起始位置;输出:无重复踏遍棋盘的结果,以数字1-64表示行走路线。

三、分析设计●需要处理的数据的逻辑结构:线性结构●合适的存储结构:顺序储存●设计好的数据类型:#define BS 8 //棋盘大小typedef int Status;int step;int board[8][8]={0}; //定义棋盘int mayway[9]; //储存可能的路径int Htry1[8]={-2,-1,1,2,2,1,-1,-2},Htry2[8]={1,2,2,1,-1,-2,-2,-1};/*存储马各个出口位置相对当前位置列下标的增量数组*/typedef struct { //位置存储表达方式int i; //行坐标int j; //列坐标int from; //存储下一步所选方向}SElemType;typedef struct {SElemType *base; //在栈构造之前和销毁之后,base的值为NULLSElemType *top; //栈顶指针int stacksize; //当前已经分配的储存空间,以元素为单位}Stack;Stack Path;●本程序包含模块:1、主程序模块:void main(){定义变量;接受命令;处理命令;退出;}234、输出路径函数模块——输出马儿行走的路径;各模块之间的调用关系:●与功能对应的模块划分定义://构造一个空栈SStatus InitStack(Stack &s);//若栈不空,则用e返回s的栈顶元素,返回OK;否则返回ERRORStatus GetTop(Stack s,SElemType &e);//插入元素e为新的栈顶元素Status Push(Stack &s,SElemType e);//若栈不空,则删除s的栈顶元素,并用e返回其值,并返回OK;否则返回ERROR Status Pop(Stack &s,SElemType &e);//从栈底到栈顶依次对栈中每个元素输出。

c语言课程设计棋盘

c语言课程设计棋盘

c语言课程设计棋盘一、教学目标本节课的学习目标包括以下三个方面:1.知识目标:学生需要掌握C语言的基本语法和编程技巧,了解棋盘游戏的原理和设计方法。

2.技能目标:学生能够运用C语言编写简单的棋盘游戏,提高编程能力和问题解决能力。

3.情感态度价值观目标:培养学生对计算机科学的兴趣,增强创新意识和团队合作精神。

二、教学内容本节课的教学内容主要包括以下几个部分:1.C语言基本语法和编程技巧:数据类型、变量、运算符、控制结构等。

2.棋盘游戏的原理和设计方法:棋盘的表示方法、游戏规则的制定、玩家交互等。

3.棋盘游戏的编程实现:编写游戏主函数、调用游戏功能函数、处理玩家输入等。

三、教学方法为了实现本节课的教学目标,我们将采用以下几种教学方法:1.讲授法:讲解C语言基本语法和编程技巧,引导学生掌握棋盘游戏的原理。

2.案例分析法:分析经典棋盘游戏案例,让学生了解游戏设计的方法和技巧。

3.实验法:让学生动手编写棋盘游戏,培养实际编程能力和问题解决能力。

4.小组讨论法:分组进行游戏设计,鼓励学生互相交流、合作,提高团队合作精神。

四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C语言程序设计》等相关教材,为学生提供理论知识的学习材料。

2.参考书:《C语言编程实例教程》等参考书,为学生提供更多的学习资源。

3.多媒体资料:制作课件和教学视频,为学生提供直观的学习体验。

4.实验设备:计算机、编程环境等,为学生提供实践操作的平台。

五、教学评估本节课的评估方式包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和积极性。

2.作业:布置相关的编程作业,评估学生的理解和应用能力。

3.考试:进行期中和期末考试,全面评估学生的知识掌握和编程能力。

评估方式应客观、公正,能够全面反映学生的学习成果。

同时,注重鼓励学生的创新和团队合作精神。

六、教学安排本节课的教学安排如下:1.教学进度:按照教材的章节和教学大纲进行教学,确保完成教学任务。

马踏棋盘-大学课程设计

马踏棋盘-大学课程设计

马踏棋盘一目的1、巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解。

2、掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等)。

3、提高利用计算机分析解决综合性实际问题的基本能力。

4、加强对基础知识的运用,做到学以致用。

5、二需求分析1、从键盘输入马起始的横坐标x和纵坐标y,其范围都是0-7。

2、马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格。

3、一般说来,当马位于位置(i,j)时,可以走到下列8个位置之一( x-2,y+1),(x-1,y+2),(x+1,y+2),(x+2,y+1),(x+2,y-1)(x+1,y-2),(x-1,y-2),(x-2,y-1)4、求出马的行走路线,将数字1到64依次填入一个8X8的方阵,输出到文本中(文本中能清楚看到方阵)。

输出的形式;(1)以数组下标形式输入,代表起始位置,i表示行标,j表示列标。

(2)以棋盘形式输出,每一格打印马走的步数,这种方式比较直观。

3、程序所能达到的功能;(1)让马从任一起点出发都能够历遍整个8×8的棋盘。

(2)能寻找多条不同的行走路径。

4.测试数据,包括正确的输入及输出结果和含有错误的输入及其输出结果。

数据可以任定,只要 0<=X<7&&0<=Y<7 就可以了。

正确的输出结果为一个2维数组,每个元素的值表示马行走的第几步。

若输入有错,程序会显示“输入错误,请重新输入:”并且要求用户重新输入数据,直至输入正确为止。

三概要设计initstack(s) //构建一个空栈。

push(s,e) //在栈顶插入新的元素。

pop(s,e)//将栈顶元素弹出。

settop(s, e) //将e设为栈顶元素。

gettop(s, e)//将栈顶元素取出。

stackempty(s) //判断栈是否为空check(int x,int y)//判断点(x,y)是否在棋盘内weighting()//求棋盘中每一点的权值四详细设计1、名称详细内容详细内容详细内容详细内容详细内容详细内容详细内容详细内容详细内容详棋盘点的结构类型定义typedef struct{int x;该点的横坐标int y;该点的纵坐标int z;}elemtype;栈的类型定义typedef struct SNode{elemtype data;struct SNode *next;}SNode,*Linkstack;栈的初始化操作int initstack(Linkstack &s){s=(Linkstack)malloc(sizeof(SNode));if(!s){printf("初始化失败!");return 0;}s->next=NULL;return 1;}入栈操作int push(Linkstack &s,elemtype e){Linkstack p;p=(Linkstack)malloc(sizeof(SNode));if(!p) return 0;p->next=s->next;s->next=p;p->data=e;return 1;}出栈操作int pop(Linkstack &s,elemtype &e) {Linkstack p=s->next;if(p==NULL) return 0;s->next=p->next;e=p->data;free(p);return 1;}取栈顶元素操作gettop(Linkstack &s,elemtype &e) {Linkstack p=s->next;if(p==NULL) return 0;e=p->data;return 1;}判断栈是否为空操作int stackempty(Linkstack s){int flag=0;if(s->next==NULL)flag=1;return flag;}设为栈顶元素操作int settop(Linkstack &s,elemtype e) {if(s->next!=NULL){s->next->data=e;return 1;}else return 0;}void setmap(){int i,j,k,m,d1,d2,x1,x2,y1,y2,l1,l2; for(i=0;i<N;i++)//for 1{for(j=0;j<N;j++)//for 2{for(k=0;k<8;k++)map[i][j][k]=k;//默认8个方向顺时针赋值for(k=0;k<8;k++)//for 3 与 for 4 两个循环对方向索引按点的权值升序排列,不能到达的方向排在最后{for(m=k+1;m<8;m++) //for 4{d1=map[i][j][k];x1=i+HTry1[d1];y1=j+HTry2[d1];d2=map[i][j][m];x2=i+HTry1[d2];y2=j+HTry2[d2];l1=check(x1,y1);l2=check(x2,y2);if((l1==0&&l2)||(l1&&l2&&(weight[x1][y1]>weight[x2][y2]))){map[i][j][k]=d2;map[i][j][m]=d1; //交换两个方向值,按权值递增排列,不可到达的目标点(超出棋盘)的方向放在最后面}//end if}//end for 4}//end for 3}//end for 2}//end for 1}//end setmap()void path(int xx, int yy){ int c[N*N]={0},h[N*N]={0};Linkstack a;elemtype ptemp;elemtype pop_temp,get_temp;elemtype p,dest_p; //当前点和目标点int step=0,x,y,s,k=1,l=1,d =0;char ch;p.x = xx; p.y = yy;p.z = 0;//初始化出发点board[xx][yy]=1;initstack(a);push(a,p); //起始点的坐标和首选方向入栈while(1){if (step==63){output(a);exit(1);}if(stackempty(a)) break;gettop(a,p);x=p.x; y=p.y; d=p.z;if(d>=8)//该点所有方向已走完,退栈{board[x][y]=0; //抹去痕迹step--; //步数减一pop(a,pop_temp); //退栈gettop(a,get_temp); //取当前栈顶元素ptemp.x=get_temp.x;ptemp.y=get_temp.y;ptemp.z=get_temp.z+1;settop(a,ptemp); //更改方向gettop(a,p);} //end if (d>=8)if(d<8)//方向未走完{s=map[x][y][d];//map[x][y][0]未必是(x,y)点的HTry[0]方向,而是到该点可到的权值最小的点的方向即HTry[map[x][y][0]dest_p.x=x+HTry1[s];dest_p.y=y+HTry2[s];if(check(dest_p.x,dest_p.y)&&board[dest_p.x][dest_p.y]==0)//目标点在棋盘内且未被走过,则将目标点入栈同时标记当前点为已走过{h[step]=step;board[x][y]=1;step++;//步数加一dest_p.z=0;push(a,dest_p);//存入目标点,方向栈初始}else//目标点已被走过或目标点不在棋盘内,换方向{ //printf(" 进行");ptemp.x=p.x;ptemp.y=p.y;ptemp.z=d+1;//取下一个方向 settop(a,ptemp);//切换方向// gettop(a,p);//gettop(a,p);//x=p.x; y=p.y; d=p.z;检测重新将d赋值//printf("%d %d %d",x,y,d);}} //enf if(d<8)//printf("步数%d\n ",step);} //end while(1)}void output(Linkstack a){ Linkstack b;int c[8][8]={0},i,j,k=N*N,l=1,x,y;initstack(b);elemtype e;while(!stackempty(a)){pop(a,e);c[e.x][e.y]=k;k--;push(b,e);}gettop(b,e);x=e.x;y=e.y;printf("起始坐标:(%d,%d)\n",x,y);while(!stackempty(b)){ pop(b,e);printf("(%d,%d)",e.x,e.y);push(a,e);}printf("棋盘表示为:\n");for(i=0;i<8;i++){for(j=0;j<8;j++){printf("%2d",c[i][j]);printf(" ");if(j==7) printf("\n");}}}五调试分析1、设计gettop函数时误将栈顶元素取出,原因是多加了一条s->next=p->next语句,造成不应有的错误2、写settop(s)函数时,忘记了s仅为头结点误将e赋值给了s->data,而实际上应为s->next->data=e;由此造成的错误极难发现,这也进一步说明了基础知识的重要。

棋盘游戏c课程设计

棋盘游戏c课程设计

棋盘游戏c课程设计一、课程目标知识目标:1. 学生能理解棋盘游戏的基本规则,掌握相关的策略与方法。

2. 学生能运用所学的棋盘游戏知识,分析并解决实际问题。

3. 学生能了解棋盘游戏的历史背景,认识到其在我国传统文化中的地位。

技能目标:1. 学生通过棋盘游戏,提高逻辑思维、策略规划和问题解决能力。

2. 学生在游戏中,锻炼团队协作、沟通表达和竞争意识。

3. 学生能够运用所学知识,设计并推广自己的棋盘游戏。

情感态度价值观目标:1. 学生培养对棋盘游戏的兴趣,激发探究欲望,形成主动学习的习惯。

2. 学生在游戏中,树立公平竞争的意识,尊重对手,培养良好的竞技道德。

3. 学生通过棋盘游戏,认识到团结协作的重要性,增强集体荣誉感。

课程性质:本课程以棋盘游戏为载体,结合学科知识,注重培养学生的思维能力、合作精神和竞技道德。

学生特点:学生处于好奇心强、求知欲旺、善于合作、乐于竞争的阶段,对棋盘游戏具有较强的兴趣。

教学要求:教师应关注学生的个体差异,因材施教,以引导、启发和鼓励为主,注重培养学生的自主学习和团队协作能力。

在教学过程中,关注学生的学习成果,及时进行评估和反馈,确保课程目标的实现。

二、教学内容本章节教学内容主要包括以下几部分:1. 棋盘游戏概述:介绍棋盘游戏的历史、种类及其在我国传统文化中的地位,让学生了解棋盘游戏的背景知识。

2. 棋盘游戏规则与策略:详细讲解常见棋盘游戏(如:围棋、象棋、五子棋等)的规则,分析游戏策略,引导学生掌握基本技巧。

3. 棋盘游戏实践:组织学生进行棋盘游戏实践,培养其逻辑思维、策略规划和问题解决能力。

4. 团队协作与竞技道德:通过棋盘游戏,让学生体验团队合作的重要性,树立公平竞争意识,培养良好的竞技道德。

5. 创新设计:鼓励学生运用所学知识,设计并推广自己的棋盘游戏,激发创新意识。

教学大纲安排如下:第一课时:棋盘游戏概述、围棋基本规则与策略第二课时:象棋基本规则与策略、五子棋基本规则与策略第三课时:棋盘游戏实践(分组进行围棋、象棋、五子棋比赛)第四课时:团队协作与竞技道德教育、创新设计(学生设计棋盘游戏)第五课时:成果展示与评价(学生展示设计成果,师生共同评价)教学内容与教材关联性:本章节内容与教材中关于逻辑思维、策略规划和团队合作的相关章节紧密相连,旨在通过棋盘游戏这一载体,实现教材知识点的实际应用。

数据结构课程设计 马踏棋盘分解

数据结构课程设计 马踏棋盘分解

杭州师范大学钱江学院课程设计2013 年12 月21 日目录一.概述 (3)二.总体方案设计 (3)三.详细设计 (4)四.最终输出 (6)五.课程设计总结 (10)参考文献 (13)一概述1.课程设计的目的(1)课题描述设计一个国际象棋的马踏遍棋盘的演示程序。

(2)课题意义通过“马踏棋盘”算法的研究,强化了个人对“栈”数据结构的定义和运用,同时也锻炼了自身的C语言编程能力。

另一方面,通过对“马踏棋盘” 算法的研究,个人对“迷宫”、“棋盘遍历”一类的问题,有了深刻的认识,为今后解决以此问题为基础的相关的问题,打下了坚实的基础。

(3)解决问题的关键点说明解决问题的关键首先要熟练掌握 C语言编程技术,同时能够熟练运用“栈”数据结构。

另外,态度也是非常重要的。

在课程设计过程中,难免会遇到困难,但是不能轻易放弃,要肯花时间,能静得下心,积极查阅相关资料,积极与指导老师沟通。

2.课程设计的要求(1)课题设计要求将马随机放在国际象棋的8X 8棋盘Board[0〜7][0〜7]的某个方格中,马按走棋规则进行移动。

要求每个方格只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8X 8的方阵,输出之。

程序由回溯法和贪心法实现,比较两种算法的时间复杂度。

(2)课题设计的思路首先,搞清楚马每次在棋盘上有 8个方向可走,定义两个一位数组,来存储马下一着点的水平和纵向偏移量。

程序再定义一个8*8二维数组,初始所有元素置0,起始点元素置1。

若为回溯法,初始方向数据(一维数组下标) 入栈。

随后,马从起始点开始,每次首先寻找下一可行的着点,然后记下方向,方向数据入栈,把该位置元素置为合适的序列号,若无下一可行着点,则回溯,寻找下一方向位置着点,以此类推,直到 64填入数组中,则输出二维数组,即为马可走的方案。

若为贪婪法,选择下一出口的贪婪标准是在那些允许走的位置中,选择出口最少的那个位置。

数据结构课程设计(马踏棋盘)

数据结构课程设计(马踏棋盘)

中南民族大学数据结构课程设计报告姓名:康宇年级: 2010学号: 10061014专业:计算机科学与技术指导老师:宋中山2013年4月15日实习报告:2.4题 马踏棋盘题目:设计一个国际象棋的马踏棋盘的演示程序班级:计科一班 姓名:康宇 学号:10061014 完成日期:2013.4.15 一、需求分析1、国际象棋的马踏棋盘的功能是:将马随机放在国际象棋的N*N 棋盘board[N][N]的某个方格中,马按走棋规则进行移动。

要求每个方格只进一次,走遍棋盘上全部N*N 个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,...,N*N 依次填入一个N*N 的方阵,输出之。

2、测试数据:N 由读者指定。

马开始的位置也有读者指定(x,y ),1<=x<=N,1<=y<=N.3、实现提示:下图显示了N 为6,马位于方格(3,3),8个可能的移动位置。

一般来说,马位于位置(x ,y )时,可以走到下列8个位置之一。

但是,如果(x,y )靠近棋盘的边缘,上述有些位置可能超出棋盘范围,成为不允许的位置。

8个可能的位置可以用两个一维数组hi[0...7],hj[0...7]来表示:1 2 3 4 5 6二、概要设计为实现上述程序功能,应用栈Stack[Max*Max]来表示棋盘的行和列。

定义棋盘的规格N,马在下一步可以走的8个位置,hi[0...7],hj[0...7],用数组board[Max][Max]来标记棋盘,top 标记栈指针。

用户在输入了期盼的规格和起始坐标后,程序通过八个方向的探寻,123456输出第一个符合要求的棋盘,棋盘上显示了马每一步的位置,每一个位置只踏了一次,且踏遍棋盘。

1、元素类型(栈):struct Stack{int i; //行坐标int j; //列坐标} stack[Max][ Max];2、建立三个全局位置数组:int hi[8]={-2,-1,1,2,2,1,-1,-2};int hj[8]={1,2,2,1,-1,-2,-2,-1};用来存放下一个可能位置的横纵坐标;int board[Max][Max];用来标记棋盘。

数据结构课程设计马踏棋盘

数据结构课程设计马踏棋盘

数据结构课程设计-马踏棋盘目录1 前言 (1)2 需求分析 (1)2.1 任务和要求 (1)2.2 运行环境 (1)2.3 开发工具 (1)3 分析和设计 (1)3.1 系统分析及设计思路 (1)3.2 主要数据结构及算法 (2)3.3 函数流程图 (2)4 具体代码实现 (10)5 课程设计总结 (17)5.1 程序运行结果 (17)5.2 设计结论 (17)参考文献 (20)致谢 (20)1 前言编写一个C语言程序,作为国际象棋中的马踏遍棋盘的演示程序。

在这里,我们用一个main函数通过调用其他一些分功能函数来实现求并且输出马踏遍棋盘的行走路线。

2 需求分析2.1 任务和要求将马随机放在国际象棋的8×8棋盘的某个方格中,马按照走棋的规则进行移动。

每个方格只进入一次,走遍棋盘的全部64个方格。

编写算法,求出马的行走路线,并按求出的行走路线,将1,2,…,64依次填入一个8×8的方阵,并输出。

要求:画出算法的流程图,分析算法的时间复杂度。

2.2 运行环境(1)WINDOWS2000/XP系统(2)Visual C++ 6.0编译环境或TC编译环境2.3 开发工具C语言3 分析和设计3.1 系统分析及设计思路根据需求分析可知,我们所设计的程序要达到让马从任意一起点出发都不重复地遍历所有的8×8棋格的功能。

按照需求,并考虑到程序的可读性,我们按顺序共设计了以下六大模块:(1)定义头文件和宏定义模块:这是C程序必不可少的一个部分,通过头文件来调用程序所需库函数,而通过宏定义进行宏替换。

(2) 数据类型定义模块:该模块定义了全局数据结构,它们的作用域为从定义开始到本源文件结束,以便于让后面很多函数都可以用到它们,而不必再重新定义。

(3) 探寻路径函数模块:按照马的行走规则对棋盘进行遍历,寻找马的行走路径,每次仅访问一个棋格,保证每个棋格都访问到且每个棋格仅访问一次。

(4) 输出路径函数模块:对探寻路径函数模块中保存下来的顺序进行输出,输出格式按照棋盘8×8的方阵格式。

棋盘游戏c课程设计报告

棋盘游戏c课程设计报告

棋盘游戏c 课程设计报告一、课程目标知识目标:1. 学生能理解棋盘游戏的起源、种类及基本规则。

2. 学生掌握运用数学知识进行棋盘游戏策略分析,如概率、组合等基本概念。

3. 学生了解棋盘游戏在不同文化背景下的历史发展和应用。

技能目标:1. 学生能够运用所学知识设计简单的棋盘游戏,提高创新能力和逻辑思维能力。

2. 学生通过棋盘游戏实践,培养团队协作和沟通能力,提高解决问题的策略选择和决策能力。

3. 学生能够运用所学知识对棋盘游戏进行评价和改进,提高批判性思维和分析能力。

情感态度价值观目标:1. 学生通过棋盘游戏培养对数学学科的兴趣和热情,激发学习积极性。

2. 学生在棋盘游戏活动中,学会遵守规则、尊重对手,培养良好的竞争意识和合作精神。

3. 学生通过了解棋盘游戏的文化背景,增强对传统文化的尊重和传承意识。

课程性质:本课程为数学学科拓展课程,以棋盘游戏为载体,结合数学知识,培养学生综合素质。

学生特点:四年级学生具备一定的数学基础和逻辑思维能力,对游戏具有较强的兴趣和好奇心。

教学要求:教师需结合学生实际情况,以引导为主,激发学生兴趣,注重培养创新精神和实践能力。

在教学过程中,关注学生个体差异,因材施教,确保课程目标的实现。

通过有效的教学设计和评估,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。

二、教学内容1. 棋盘游戏简介:介绍棋盘游戏的起源、种类及发展历程,关联教材中数学史相关章节,让学生了解棋盘游戏的文化价值。

2. 棋盘游戏规则与策略:结合教材中逻辑思维与策略制定相关内容,讲解典型棋盘游戏(如五子棋、国际象棋等)的基本规则及策略运用。

3. 数学知识在棋盘游戏中的应用:运用教材中的概率、组合等知识,分析棋盘游戏中的数学问题,提高学生的数学应用能力。

4. 设计与改进棋盘游戏:鼓励学生结合所学知识,创新设计棋盘游戏,关联教材中创新思维与问题解决相关内容,提升学生实践能力。

5. 棋盘游戏的评价与反思:指导学生运用所学知识对现有棋盘游戏进行评价和改进,结合教材中批判性思维相关内容,提高学生的分析能力。

马踏棋盘c++课程设计

马踏棋盘c++课程设计

马踏棋盘c++课程设计1.问题描述设计一个国际象棋的马踏棋盘的演示程序2.需求分析(1)将马随即放在国际象棋的8×8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。

要求每个方格只进入一次,走遍棋盘上全部64个方格。

(2)编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,……,64依次填入一个8×8的方阵,输出之。

(3)程序执行命令为:1)输入起始方格坐标(X,Y)2)求解第一组路径并显示,按Q键退出系统,按其他任意键求解并显示下一组路径。

(4)测试数据:(0,0),(1,2)3概要设计3.1[程序设计思路].按照顺时针顺序,每次产生一个新的路点,并验证此路点的可用性,需要考虑的问题包括是否超出棋盘和此点已经走过与否。

如新路点可用,则入栈,并执行下一步,每次按照上一路点的位置生成新路点。

如一个路点的可扩展路点数为0,则走不下去了,进行回溯。

3.2[存储结构设计]8个可能位置可以用两个一维数组表示:数组1: 0 1 2 3 4 5 6 7-2 -1 1 1221-1 -2数组2:0 1 2 3 4 5 6 71 2 2 1 -1 -2 -2 -1位于(i,j)的马可以走到的新位置是在棋盘范围内的(I+数组1[h],j+数组2[h]),其中h=0,1,…7。

每次在多个可走位置中选择其中一个进行试探,其中未曾试探过的可走位置用适当栈结构妥善管理,也备试探失败时的“回溯”(悔棋)使用,即用栈结构存储试探的路径来进行路径试探操作。

3.3[主要算法设计]3.3.1栈类的定义和接口:templateclass MyStack{private:Type *bottom; // 元素存放的动态数组int size,ptr; // 堆栈大小和当前栈顶元素索引inline int extent(){…}; //当栈满时,自动扩充public://构造函数MyStack() {bottom=new Type[BASESIZE];ptr=-1;size=BASESIZE;};//用默认大小初始化MyStack(int i) {bottom=new Type[i];ptr=-1;size=i;}; //用指定大小初始化//析构函数~MyStack(){if(bottom!=NULL) delete []bottom;};//清栈inline void clear(){…};//判栈空inline bool IsEmpty(){…};//入栈int push(Type e);//出栈int pop(Type &e);//获得栈顶元素int top(Type &e);//直接修改栈定元素int settop(Type e);// 用callback函数对栈从栈底向上遍历void traverse(void callback(Type *),Type *); };3.3.2本程序的结构1)主程序模块:void main(){初始化;向屏幕输出输入提示;接受输入起始坐标(X,Y);输出第一组解的路径和回溯情况;while(1){接受命令;处理命令{if(命令==退出)退出;其他命令{输出下一组解的路径及回溯情况;}}}异常处理{};正常退出;}2)路径求解模块---求解所有可行的路径3)可行路径求解的核心算法:bool Result(int start_x, int start_y, int board[][8]){初始化路径栈sPath;初始化方向栈sDir;初始化当前步数序号和当前方向step = 1, d = 0将点(start_x,start_y)入路径栈,将该点方向d入方向栈;while(1){将当前的路径栈中点出栈并保存,将该点方向出栈并保存;//为上一次的目标点和目标方向if(方向=>8){ 抹去该点痕迹;步数序号-1;调用MyStack的traverse函数演示退栈情况;退栈;方向栈中的方向++;continue;}if(方向<8)//方向未走完{if(目标点在棋盘内且未被走过){ 记录序号,目标点入栈,目标点方向初始为0入栈;continue;}else(目标点已被走过或目标点不在棋盘内){方向++;continue;//继续}}//enf if(d<8)if (步数序号已满){向屏幕输出路径if(查看下一路径){回退一步;方向++;continue;}}} //end while(1)}3.4[测试用例设计]依次输入(0,0)(1,2)4详细设计4.1堆栈类MyStack参见文件base 中MyStack模板类的定义和实现。

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

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

数据结构课程设计报告题目:马踏棋盘学院计算机专业计算机科学与技术年级班别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为列标,用空格符号隔开。

数据结构课程设计 马踏棋盘求全部解及演示程序

数据结构课程设计  马踏棋盘求全部解及演示程序

安徽工程大学信息10 课程设计马踏棋盘的求解及演示设计摘要数据结构是计算机科学与技术专业的一门核心专业基础课程,是一门理论性强、思维抽象、难度较大的课程。

我认为学习数据结构的最终目的是为了获得求解问题的能力。

对于现实世界中的问题,我们应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。

《数据结构》课程设计是计算机科学技术专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。

开设本课程设计实践的主要目的就是要达到理论与实际应用相结合,提高学生的动手能力,完成计算机应用能力的培养;本课程设计主要解决马踏棋盘的问题,找出踏遍棋盘的多种路径,并实现动态要是过程。

马踏棋盘问题,实际上是图论中的哈密顿通路问题,是典型的NP问题,求解的问题与算法设计有很大关系,如果采取穷举搜索的话,很容易陷入海量搜索的状态,耗费巨大的时间,使问题几乎不可解,因此马在棋盘上遍历采用算法当中的深度优先算法和启发式贪心算法,用栈来存储遍历过程,通过对栈的使用实现对所有路径的搜索。

在调试过程发现,启发式贪心算法,针对于马踏棋盘问题有着极大的好处,就是无论从棋盘上哪个点开始,找到一条遍历完棋盘的通路是不需要回溯的,也就节省了大量的时间,而试探性的操作对于每个点都也只有168步,所以求出所有路径在不到一秒的时间内完成。

关键词:马踏棋盘;骑士周游;哈密顿通路;NP-完全问题;贪心算法;回溯法;目录马踏棋盘的求解及演示设计 (1)目录 (2)第一章引言 (3)第二章需求分析 (4)2.1问题描述 (4)2.2基本要求 (4)2.3具体需求 (4)2.4开发环境 (4)第三章概要设计 (5)3.1 系统概述 (5)3.2 系统描述 (6)3.3逻辑设计 (6)第四章详细设计 (7)4.1 功能模块设计 (7)4.2 数据结构设计 (7)4.3算法设计 (9)第五章调试与分析 (13)5.1 调试分析 (13)第六章系统试用说明 (14)6.1 系统试用说明 (14)第七章总结与体会 (14)参考文献 (15)第一章引言本课程设计主要研究马踏棋盘的问题,即骑士周游问题,是将马随机放在国际象棋的8×8棋盘的某个方格中,“马”按照走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格。

马踏棋盘课程设计摘要

马踏棋盘课程设计摘要

马踏棋盘课程设计摘要一、课程目标知识目标:使学生掌握“马踏棋盘”问题中的基本算法原理,理解程序设计的顺序、选择和循环结构,掌握利用算法解决实际问题的方法。

技能目标:培养学生运用所学算法知识解决“马踏棋盘”问题的能力,提高学生的逻辑思维和编程技能,使其能独立编写并优化程序代码。

情感态度价值观目标:激发学生对计算机科学的兴趣,培养他们面对问题积极思考、勇于挑战的精神,增强团队协作意识,认识到合作解决问题的重要性。

课程性质:本课程以算法与程序设计为核心,结合实际操作,注重培养学生的动手能力和解决问题的能力。

学生特点:五年级学生已具备一定的逻辑思维能力和计算机操作技能,对新鲜事物充满好奇心,但需进一步引导和培养。

教学要求:结合学生特点,采用任务驱动教学法,引导学生自主探究、合作学习,实现课程目标。

将目标分解为具体学习成果,如:学生能独立编写“马踏棋盘”程序,并在课堂上展示和分享成果,以便进行教学评估。

二、教学内容本课程以《信息技术》教材中“算法与程序设计”章节为基础,结合“马踏棋盘”问题进行教学。

具体内容包括:1. 算法原理:介绍“马踏棋盘”问题的背景和基本算法原理,如贪心算法、回溯算法等。

2. 程序设计结构:回顾顺序、选择和循环结构,引导学生运用这些结构编写程序解决“马踏棋盘”问题。

3. 编程实践:指导学生使用编程软件(如Scratch或Python等)进行“马踏棋盘”程序编写和调试。

4. 算法优化:探讨优化算法的方法,如剪枝策略,提高程序的效率和性能。

教学大纲安排如下:第一课时:导入“马踏棋盘”问题,介绍算法原理,让学生了解课程目标。

第二课时:复习程序设计结构,引导学生思考如何运用这些结构解决问题。

第三课时:分组讨论,每组制定解决方案,开始编写程序。

第四课时:展示学生成果,互相评价,教师点评和指导,优化算法。

第五课时:总结课程,让学生分享学习心得,巩固所学知识。

教学内容与教材紧密关联,注重实践操作,旨在提高学生的编程能力和问题解决能力。

数据结构课程方案马踏棋盘

数据结构课程方案马踏棋盘

数据结构课程设计报告设计题目:马踏棋盘院系计算机学院年级11级学生XXXXXXX学号XXXXXXXXX扌旨导教师XXXXXXXXX起止时间9-6/9-132018年9月10日星期二目录一、课程设计目的-------------------------------------- 3二、需求分析 ------------------------------------------ 3三、程序源代码 -------------------------------------------- 4四、调试分析---------------------------------------------- 7五、问题总结---------------------------------------------- 8六、参考资料----------------------------------------------- 9一、课程设计目的(1>熟练使用C语言编写程序,解决实际问题。

(2>了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。

(3>初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。

(4>提高综合运用所学的理论知识和方法独立分析和解决问题的能力。

二、需求分析问题描述:将马随机放在国际象棋的8X8棋盘中的某个方格中,马按走棋规则进行移动。

要求每个方格上只进入一次,走遍棋盘上全部64个方格。

编制递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。

测试数据:由读者指定可自行指定一个马的初始位置。

实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”悔棋使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

背景介绍:国际象棋为许多令人着迷的娱乐提供了固定的框架,而这些框架常独立于游戏本身。

马的遍历VC课程设计报告.doc

马的遍历VC课程设计报告.doc

马的遍历VC课程设计报告课程设计报告学院、系专业名称网络工程课程设计科目VC程序课程设计学生姓名指导教师完成时间2010年9月-11月解骑士巡游问题一、设计任务与目标国际象棋中马采用“日”字走法,对棋盘上马所在的结点,一步内到达的结点最多有八个,即假设马所在点的坐标为(i,j),那么其它八个结点的坐标为(i1,j2),(i2,j1),(i2,j-1),(i1,j-2),(i-1,j-2),(i-2,j-1),(i-2,j1),(i-1,j2)把这些点看作马所在点的邻接点,所以可以采用类似图的深度优先遍历,以马所在点为初始点对整个棋盘进行遍历。

然后按遍历的顺序输出结点棋盘的规格限制为8*8,输入数据为起始点的位置(0-7)。

输出数据为可以遍历成功的若干方案(本程序设置为至多八种)。

二、方案设计与论证解决马的遍历问题,可以用一个二维数组board[][]来表示棋盘,一开始用来存放步骤号,若走过了则把它赋值为1。

另对马的8种可能走法设定一个顺序,如当前位置在棋盘的(i,j)方格,下一个可能的位置依次为(i2,j1)、(i1,j2)、(i-1,j2)、(i-2,j1)、(i-2,j-1)、(i-1,j-2)、(i1,j-2)、(i2,j-1),实际可以走的位置尽限于还未走过的和不越出边界的那些位置。

为便于程序的同意处理,可以引入两个数组mover[]、movec[],分别存储各种可能走法对当前位置的纵横增量。

整形变量step存放步骤号,start存放遍历次数,在numable 函数和number函数中的语句kistartN;中是用于定位,保证不会超过棋盘范围和八次遍历都不会走同样的路径test存放遍历成功次数。

在88方格的棋盘上,从任意指定的方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。

程序框图或流程图,程序清单与调用关系主函数调用Number函数Next函数调用调用Numable函数函数调用关系2.重要模块(next 模块)的流程图开始Next[],num,num1,minnum,I,k 的初始化将返回下次可以查找的增量赋给num 判断num是否为0 是返回-1 否将i赋值为0 判断i是否小于num 否返回k 是给Num1赋值判断num小于1是否minnum 否是给Minnum和k赋值I 自增图2.2 流程图三、全部源程序清单include include include define N 8//棋盘行列数define INF 9999999 int mover[]{-2,-1,1,2,2,1,-1,-2};//用来表示要走向该i行,需要移动的格子数int movec[]{1,2,2,1,-1,-2,-2,-1};//用来表示要走向该j列,需要移动的格子数class qi { private int board[N1][N1];//用于保存走的次序int start;//测试次数int ber,bec;//用于保存输入(初始)的行列int step;//走的步数int test;//可以遍历成功的次数int r,c;//当前行列值int i,j;//循环变量int k;//下次可以查找的增量的个数public qi; qiint a,int b; int nextint r, int c; int numableint r,int c,int nexta[];//返回下次可以查找的增量int numberint r,int c;//返回下次可以查找的增量的个数bool beginint a,int b; void setint a,int b; }; qiqiint a,int b { bera; becb; } qiqi { } void qisetint a,int b { bera; becb; } int qinextint r,int c { int nexta[20],num,num10,minnum,i,k; minnumINF;//初始化minnum numnumabler,c,nexta;//下次可以查找的增量ifnum0 return -1; //没有出口fori0;iN*N//如果步数大于棋盘的格子数则表明遍历成功{ cout0 q.begina,b; coutc; ifc y ||c Y d1; else d0; system“cls“; } return 0; }四、程序运行的测试与分析因为本程序最大的特点就是可以将所有可遍历成功的路径都显示出来,所以我用了两组测试数据分别对有八种成功遍历路径和小于八种成功遍历路径的情况进行说明。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.问题描述设计一个国际象棋的马踏棋盘的演示程序2.需求分析(1)将马随即放在国际象棋的8×8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。

要求每个方格只进入一次,走遍棋盘上全部64个方格。

(2)编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,……,64依次填入一个8×8的方阵,输出之。

(3)程序执行命令为:1)输入起始方格坐标(X,Y)2)求解第一组路径并显示,按Q键退出系统,按其他任意键求解并显示下一组路径。

(4)测试数据:(0,0),(1,2)3概要设计3.1[程序设计思路].按照顺时针顺序,每次产生一个新的路点,并验证此路点的可用性,需要考虑的问题包括是否超出棋盘和此点已经走过与否。

如新路点可用,则入栈,并执行下一步,每次按照上一路点的位置生成新路点。

如一个路点的可扩展路点数为0,则走不下去了,进行回溯。

3.2[存储结构设计]8个可能位置可以用两个一维数组表示:数组1: 0 1 2 3 4 5 6 7-2 -1 1 1221-1 -2数组2:0 1 2 3 4 5 6 71 2 2 1 -1 -2 -2 -1位于(i,j)的马可以走到的新位置是在棋盘范围内的(I+数组1[h],j+数组2[h]),其中h=0,1,…7。

每次在多个可走位置中选择其中一个进行试探,其中未曾试探过的可走位置用适当栈结构妥善管理,也备试探失败时的“回溯”(悔棋)使用,即用栈结构存储试探的路径来进行路径试探操作。

3.3[主要算法设计]3.3.1栈类的定义和接口:template <class Type>class MyStack{private:Type *bottom; // 元素存放的动态数组int size,ptr; // 堆栈大小和当前栈顶元素索引inline int extent(){…}; //当栈满时,自动扩充public://构造函数MyStack() {bottom=new Type[BASESIZE];ptr=-1;size=BASESIZE;};//用默认大小初始化MyStack(int i) {bottom=new Type[i];ptr=-1;size=i;}; //用指定大小初始化//析构函数~MyStack(){if(bottom!=NULL) delete []bottom;};//清栈inline void clear(){…};//判栈空inline bool IsEmpty(){…};//入栈int push(Type e);//出栈int pop(Type &e);//获得栈顶元素int top(Type &e);//直接修改栈定元素int settop(Type e);// 用callback函数对栈从栈底向上遍历void traverse(void callback(Type *),Type *);};3.3.2本程序的结构1)主程序模块:void main(){初始化;向屏幕输出输入提示;接受输入起始坐标(X,Y);输出第一组解的路径和回溯情况;while(1){接受命令;处理命令{if(命令==退出)退出;其他命令{输出下一组解的路径及回溯情况;}}}异常处理{};正常退出;}2)路径求解模块---求解所有可行的路径3)可行路径求解的核心算法:bool Result(int start_x, int start_y, int board[][8]){初始化路径栈sPath;初始化方向栈sDir;初始化当前步数序号和当前方向step = 1, d = 0将点(start_x,start_y)入路径栈,将该点方向d入方向栈;while(1){将当前的路径栈中点出栈并保存,将该点方向出栈并保存;//为上一次的目标点和目标方向if(方向=>8){ 抹去该点痕迹;步数序号-1;调用MyStack的traverse函数演示退栈情况;退栈;方向栈中的方向++;continue;}if(方向<8)//方向未走完{if(目标点在棋盘内且未被走过){ 记录序号,目标点入栈,目标点方向初始为0入栈;continue;}else(目标点已被走过或目标点不在棋盘内){方向++;continue;//继续}}//enf if(d<8)if (步数序号已满){向屏幕输出路径if(查看下一路径){回退一步;方向++;continue;}}} //end while(1)}3.4[测试用例设计]依次输入(0,0)(1,2)4详细设计4.1堆栈类MyStack参见文件base 中MyStack模板类的定义和实现。

4.2求解出所有路径为了快速求解出所有路径,使用了优化策略,即计算各个点的可以行走的下一个点的个数作为点的权值存放在权值矩阵weight[8][8]中;然后根据这个矩阵对各点的8方向各方向按权设置优先级,保存于各点方向矩阵序列map[8][8][8],权值小的优先行走。

详见horse.cpp文件中的setweight,setmap函数。

4.3求解路径核心算法函数bool Result(int myx, int myy, int board[][8]){ MyStack<MyPoint> sPath; // 栈,记录路径点MyStack<int> sDir; // 栈,记录方向选择MyPoint p,dest_p; // 当前点和目标点int step = 1, d = 0; // 当前序号,方向p.x = myx; p.y = myy;sPath.push(p); sDir.push(d);//起始点的坐标和首选方向入栈,//map[x][y][0]未必是(x,y)点的offset[0]方向,而是到该点可到的权值最小的点的方向即offset[map[x][y][0]] board[p.x][p.y] = 1;//起始点标记已走且序号为1MyPoint pTemp;int iTemp;while(1){if (step==N*N) //路径完成{ void(*pFun)(MyPoint *) ;pFun=&TraverseOut;MyPoint *e=NULL;cout<<"\n起始点为("<<myx<<","<<myy<<")的解空间\n";cout<<"依次走以下坐标(按行顺序)[第"<<num<<" 组] \n";sPath.traverse(TraverseOut,e);output();//输出路径矩阵if(ch=='q')break;else//回退前一步{ sPath.pop(p);sDir.pop(d);//退栈;sDir.top(d);sDir.settop(d+1);step--;continue;}}if(sPath.top(p)==-1||sDir.top(d)==-1) break;int x=p.x;int y=p.y;if(d>=8)//该点所有方向已走完,退栈{ board[x][y]=0;//初始化;step--;sPath.pop(pTemp);sDir.pop(iTemp);//退栈sDir.top(iTemp);sDir.settop(iTemp+1);//更改方向continue;}//end if (d>=8)if(d<8)//方向未走完{int off=map[x][y][d];dest_p.x=x+offset[off].x;dest_p.y=y+offset[off].y;if(check(dest_p.x,dest_p.y)&&board[dest_p.x][dest_p.y]==0)//目标点在棋盘内且未被走过,则将目标点入栈同时标记为已走过{ board[x][y]=step;//记录序号sPath.push(dest_p);//存入目标点sDir.push(0); //存入方向栈初始0;continue;}else//i目标点已被走过或目标点不在棋盘内,换方向{ d++;//取下一个方向sDir.settop(d);//换方向continue;//继续}} //enf if(d<8)} //end while(1)}4.4main和其他UI函数核心代码/*horse.cpp 马踏棋盘算法实现文件文件 base 是自定义的数据结构类的定义和实现文件*/ #include <iostream>#include "base"using namespace std;/*全局宏,常量,变量,函数声明*/#define N 8 //棋盘大小int map[N][N][8]; //按各点权值递升存放待走方向,每点8个int weight[N][N]; //各点的权值int board[N][N]; //表示棋盘的数组static MyPoint offset[8] = // 8个候选方向的偏移{ -2, 1, -1, 2, 1, 2, 2, 1, 2, -1, 1, -2, -1, -2, -2, -1 };char ch;int num=1;void setweight();//求各点权值void setmap(); //各点的8个方向按权值递增排列bool Result(int x, int y, int board[][8]); //主算法函数/*主函数*/void main(){ for(int i=0;i<8;i++)for(int j=0;j<8;j++)board[i][j]=0;setweight();setmap();char x,y;while(1){ cout<<"请输入起始点坐标X (可取0~7):";cin>>x;cout<<"请输入起始点坐标Y (可取0~7):";cin>>y;if(x<'0'||x>'7'||y<'0'||y>'7')cout<<"起始坐标错误,重新输入!\n\n";break;}bool re=Result(x-'0',y-'0',board);cout<<endl<<endl;if(re=false)cout<<"Bye!\n\n";elsecout<<"Good Bye!\n\n";}//end main()/*求各点权值:可走的方向数.该值越小,则被上一点选中的可能性越大*/ void setweight(){for(int i=0;i<N;i++)//for 1{ for(int j=0;j<N;j++)//for 2{ weight[i][j]=0;for(int k=0;k<N;k++)// for 2{ int x,y;x=i+offset[k].x;y=j+offset[k].y;if(x>=0&&x<N&&y>=0&&y<N){weight[i][j]++;//即在8个方向中,(i,j)点有几个方向可以移动}}}}//end of for 1}//end setweight()/*检查(i,j)是否在棋盘内*/int check(int i,int j){ if(i<0||i>=8||j<0||j>=8)return 0;return 1;}/*标准输出*/void output(){ cout<<"求解结果矩阵[第"<<num<<" 组] \n";num++;for(int i=0;i<8;i++){ for(int j=0;j<8;j++)if(board[i][j]==0)cout<<64<<"\t";else cout<<board[i][j]<<"\t";}cout<<"\n";cout<<"输入q to quit,其他字符查看其他路径:";cin>>ch;}/*将各点的8个方向按该方向下的目标点的权值递增排列,不可到达的目标点(超出棋盘)的方向放在最后面*/void setmap(){ for(int i=0;i<N;i++)//for 1{ for(int j=0;j<N;j++)//for 2{ for(int k=0;k<8;k++)map[i][j][k]=k;//设置默认方向索引for(int k=0;k<8;k++)//for 3 与for 4 两个循环对方向索引按点的权值升序排列,不能到达的方向排在最后{ for(int m=k+1;m<8;m++) //for 4{ int d1=map[i][j][k];int x1=i+offset[d1].x;int y1=j+offset[d1].y;int d2=map[i][j][m];int x2=i+offset[d2].x;int y2=j+offset[d2].y;int n1=check(x1,y1);int n2=check(x2,y2);if( ( n1==0 && n2 ) || /*k方向不可达到,而m方向可达到*/( n1 && n2&&weight[x1][y1]>weight[x2][y2] )/*都可到但达m方向权值小*/){ map[i][j][k]=d2;map[i][j][m]=d1; /*向交换两个方值*/}//end if}//end for 4}//end for 3}//end for 2}//end for 1}//end setmap()void TraverseOut(MyPoint *e){ static iEndl=1;cout<<"("<<e->x<<","<<e->y<<") ";iEndl%=8;if(iEndl==0)iEndl++;}bool Result(int myx, int myy, int board[][8])// bool (*callback)(MyStack<Type>&, bool)=NULL){ MyStack<MyPoint> sPath; // 栈,记录路径点MyStack<int> sDir; // 栈,记录方向选择MyPoint p,dest_p; // 当前点和目标点int step = 1, d = 0; // 当前序号,方向p.x = myx; p.y = myy;sPath.push(p); sDir.push(d);//起始点的坐标和首选方向入栈,// map[x][y][0]未必是(x,y)点的offset[0]方向,而是到该点可到的权值最小的点的方向即offset[map[x][y][0]] board[p.x][p.y] = 1;//起始点标记已走且序号为1MyPoint pTemp;int iTemp;while(1){ if (step==N*N){ /*void(*pFun)(MyPoint *) ;pFun=&TraverseOut;MyPoint *e=NULL;cout<<"\n起始点为("<<myx<<","<<myy<<")的解空间\n";cout<<"依次走以下坐标(按行顺序)[第"<<num<<" 组] \n";sPath.traverse(TraverseOut,e);*/output();if(ch=='q')break;else//回退前一步{ sPath.pop(p);sDir.pop(d);//退栈;sDir.top(d);sDir.settop(d+1);step--;continue;}}if(sPath.top(p)==-1||sDir.top(d)==-1) break;int x=p.x;int y=p.y;if(d>=8)//该点所有方向已走完,退栈{ //cout<<endl<<"back:("<<x<<" ,"<<y<<")#"; //debug infoboard[x][y]=0;//抹去痕迹;step--;sPath.pop(pTemp);sDir.pop(iTemp);//退栈sDir.top(iTemp);sDir.settop(iTemp+1);//更改方向continue;}//end if (d>=8)if(d<8)//方向未走完{ int off=map[x][y][d];dest_p.x=x+offset[off].x;dest_p.y=y+offset[off].y;if(check(dest_p.x,dest_p.y)&&board[dest_p.x][dest_p.y]==0)//目标点在棋盘内且未被走过,将目标点入栈并标记当前点为已走过{ //cout<<"\n"<<"in :("<<dest_p.x<<","<<dest_p.y<<") step="<<step<<" d:"<<d;//debug infoboard[x][y]=step;//记录序号step++;sPath.push(dest_p);//存入目标点sDir.push(0); //存入方向栈初始0;continue;}else//i目标点已被走过或目标点不在棋盘内,换方向{ d++;//取下一个方向sDir.settop(d);//换方向continue;//继续}}//enf if(d<8)}//end while(1)}5调试分析程序中的指针操作多次出现错误,尤其发生在操作栈中的方向分量时,由于操作的失误,开始实际未保存此数据,导致多次循环需要回溯时进入死循环。

相关文档
最新文档