1、马的遍历 问题描述设计要求是马从棋盘上的一个位置出发,然后按照中国象棋的规则马走日,来走下一步,直到马走完棋盘上的每一个位置终止。 设计思路首先将棋盘每个位置的标记为0,然后对棋盘周围的两个格子标记为1,用于检测,相当于棋盘的边界。每个节点的包含马走过的位置以及方向。将节点以及下一次要走的方向压入栈中,然后对每个节点可以走的方向进行判断,然后找出最佳的方向。 数据结构设计将节点走过的位置以及方向封装到一起,利用栈的特点实现马的遍历。 功能函数设计void Init_Path(path *p)初始化栈int Push_Path(path *p,pathnode t,int v)将节点以及下一次走
2、的方向压入栈中int Empty(path p)判断栈是否为空int Pop_Path(path *p,pathnode *t)出栈int Count(int x,int y)计算节点周围可以移动的所有方向int Find_Direction(int x,int y)寻找下一次移动的方向void Round(int x,int y,int v)马的遍历函数void Mark_Dir(int v)标志方向函数void Mark_Che(int v)标志棋盘函数 程序代码#include#includeint chessboard1413;/二维数组表示棋盘每个棋子位置,其中棋盘四周有两个格子,用
3、于检测int CanPass14138;/每个棋子的八个方向哪些可以走typedef struct/棋盘的八个方向int y,x;direction;direction dir8=2,1,1,2,-1,2,-2,1,-2,-1,-1,-2,1,-2,2,-1;/八个方向/栈的设计typedef structint x,y;/走过位置int di;/方向pathnode;typedef structpathnode pa90;int top;path;/顺序栈void Init_Path(path *p)/初始化栈p-top=-1;int Push_Path(path *p,pathnode t
4、,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;int Count(int x,int y)/计算每个节点周围有几个方向可以走int count=0,i=0;for(i=0;icount)min=count;d=dire;if(d8+2*v)printf(“输入错误,请重新输入 !(横坐标在1-%d之间)n“,8+2*v);elsebreak;while(1)printf(“请输入入口点纵坐标: “);scanf(“%d“,if(y8+v)printf(“输入错误,请重新输入 !(纵坐标在1-%d之间)n“,8+v);elsebreak;Round(x,y,v);printf(“继续(是:y;否:其他 ):“);fflush(stdin);scanf(“%c“, 运行与测试