数据结构课程设计题目:马踏棋盘院系:班级:学号:姓名:2014-2015年度第1学期马踏棋盘一.题目:马踏棋盘 (3)二. 设计目标 (3)三. 问题描述 (3)四. 需求分析 (4)五. 概要设计 (4)第一步:定义四个常量和一个数据类型 (4)第二步:构造函数 (4)六. 详细设计(给出算法的伪码描述和流程图) (5)流程图设计 (5)代码分析 (9)第一步:定义常量与变量 (9)第二步:构造函数 (9)●定义一个结构体类型 (9)●创建一个初始化函数 (10)●创建提示输入函数 (10)●创建产生新节点函数 (11)●创建计算路径函数 (12)●创建入栈函数 (13)●创建出栈函数 (13)●创建输出函数 (13)第三步:在主函数中调用其它函数 (15)七. 测试分析 (16)八. 使用说明 (16)九. 测试数据 (16)十.课程设计总结 (17)一.题目:马踏棋盘二. 设计目标帮助学生熟练掌握顺序栈的基本操作,让学生深入了解栈的使用,使得更深层次的灵活运用栈。
三. 问题描述○所谓的马踏棋盘是:将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则(马走日字)进行移动。
要求每个方格只进入一次,走遍棋盘上全部64个方格。
由用户自行指定一个马的初始位置,求出马的行走路线,并按照求出的行走路线的顺序,将数字1、2、…、64依次填入一个8X8的方阵并输出。
从用户给出的初始位置开始判断,按照顺时针顺序,每次产生一个新的路点,并验证此路点的可用性,需要考虑的是当前路点是否超出棋盘范围和此路点是否已经走过。
如果新路点可用,则入栈,并执行下一步,重复进行如上步骤,每次按照已走路点的位置生成新路点。
如果一个路点的可扩展路数为0,进行回溯,直到找到一个马能踏遍棋盘的行走路线并输出。
四. 需求分析1. 让用户输入马的初始位置;2. 按照马的行走路线,判断马是否能够走遍整个棋盘;3. 输出结果(若能走遍,则输出马的行走路线,若不能,提示用户“此时不能踏遍棋盘上所有点!”)五. 概要设计为了实现上述程序功能,程序包含以下几大模块:第一步:定义四个常量和一个数据类型:MAXNUM、INVALIDDIR、MAXLEN、MAXDIR、HorsePoint 第二步:构造函数:void Initial() //初始化函数;void PushStack(HorsePoint positon) //入栈函数;HorsePoint GetInitPoint() //请求用户输入函数;HorsePoint GetNewPoint(HorsePoint *parent) //产生新节点函数;void CalcPoint(HorsePoint hh) //计算路径的函数;void PrintChess() //输出函数;int main(int argc,char* argv[]) //主函数六. 详细设计(给出算法的伪码描述和流程图)总体操作步骤如下:流程图设计:代码分析:第一步:定义常量与变量:常量:MAXNUM 8 ---------- /*横纵格数的最大值*/INVALIDDIR -1 ---------- /*无路可走的情况*/MAXLEN 64 ---------- /*棋盘总个数*/MAXDIR 8 ---------- /*下一步可走的方向*/ 变量:HorsePoint ChessPath[MAXLEN] /*模拟路径栈*/Int count /*入栈节点个数*/int ChessBoard[MAXNUM][MAXNUM] /*标志棋盘数组*/ 第二步:构造函数:为了明确马将要走的路线,我们必须定义一个结构体类型:typedef struct{int x; /*表示横坐标*/int y; /*表示纵坐标*/int direction; /*表示移动方向*/ }HorsePoint;●创建一个初始化函数:void Initial() /{int i,j;for(i=0;i<MAXNUM;i++)for(j=0;j<MAXNUM;j++)ChessBoard[i][j]=0; /*棋盘格均初始化为0,代表没走过*/for(i=0;i<MAXLEN;i++){ChessPath[i].x=0;ChessPath[i].y=0;ChessPath[i].direction=INVALIDDIR;}count=0; /*栈中最初没有元素*/}●创建提示输入函数HorsePoint GetInitPoint(){HorsePoint positon;do{printf("\n请输入起始点(y,x):");scanf("%d,%d",&positon.x,&positon.y);printf("\n请稍等......\n");printf("\n\n");}while(positon.x>=MAXNUM || positon.y>=MAXNUM || positon.x<0 || positon.y<0); /*不超过各个边缘时*/positon.direction=INVALIDDIR; /*是初值,没走过*/return positon;}创建产生新节点函数:HorsePoint GetNewPoint(HorsePoint *parent){int i;HorsePoint newpoint;/*能走的8个方向的坐标增量*/int tryx[MAXDIR]={ 1, 2, 2, 1,-1,-2,-2,-1};int tryy[MAXDIR]={-2,-1, 1, 2, 2, 1,-1,-2};/*新结点可走方向初始化*/newpoint.direction=INVALIDDIR;parent->direction=parent->direction++; /*上一结点能走的方向*/for(i=parent->direction;i<MAXDIR;i++){newpoint.x=parent->x+tryx[i]; /*试探新结点的可走方向*/newpoint.y=parent->y+tryy[i];if(newpoint.x<MAXNUM&&newpoint.x>=0&&newpoint.y<MAXNUM&&newpoint.y>=0 &&ChessBoard[newpoint.x][newpoint.y]==0){parent->direction=i; /*上一结点可走的方向*/ChessBoard[newpoint.x][newpoint.y]=1; /*标记已走过*/return newpoint;}}parent->direction=INVALIDDIR;return newpoint;}创建计算路径函数:void CalcPoint(HorsePoint hh){HorsePoint npositon;HorsePoint *ppositon;Initial(); /*调用初始化函数*/ppositon=&hh; /*调用输入起始点函数*/PushStack(*ppositon);while(!(count==0 || count==MAXLEN))/*当路径栈不空或不满时*/{ppositon=&ChessPath[count-1]; /*指针指向栈*/npositon=GetNewPoint(ppositon); /*产生新结点*/if(ppositon->direction!=INVALIDDIR) /*如果可以往下走*/{ChessPath[count-1].direction=ppositon->direction;PushStack(npositon);}elsePopStack();}}●创建入栈函数:void PushStack(HorsePoint positon) /*入栈函数*/{ChessBoard[positon.x][positon.y]=1; /*把标志设为1,证明已走过*/ChessPath[count]=positon; /*把标志为1的结点入栈*/count++; /*栈中结点个数加1*/}●创建出栈函数:HorsePoint PopStack() /*出栈函数*/{HorsePoint positon;count--;positon=ChessPath[count];ChessBoard[positon.x][positon.y]=0;ChessPath[count].direction=INVALIDDIR;return positon;}●创建输出函数:void PrintChess() /*以8*8矩阵的形式输出运行结果*/{int i,j;/*state[i][j]为棋盘上(i,j)点被踏过的次序*/int state[MAXNUM][MAXNUM];int step=0; /*行走步数初始化*/HorsePoint positon;count=MAXLEN;if(count==MAXLEN) /*当棋盘全部走过时*/{for( i=0;i<MAXLEN;i++){step++;positon=ChessPath[i];state[positon.x][positon.y]=step;}for(i=0;i<MAXNUM;i++){printf("\t\t");for( j=0;j<MAXNUM;j++){if(state[i][j]<10)printf(" ");printf("%d ",state[i][j]); /*按顺序输出马踏过的点*/}printf("\n");}printf("\n");}elseprintf("\t\t此时不能踏遍棋盘上所有点!\n");}第三步:在主函数中调用其它函数int main(int argc,char* argv[]){HorsePoint h; /*定义一个结构体类型的变量*/h=GetInitPoint(); /*将用户输入的数据赋给变量h*//*先调用初始化函数,然后将用户输入的数据入栈,判断马的行走方向,确定后,产生新节点,将新节点入栈,直到马踏遍整个棋盘或者无法踏遍整个棋盘为止。