题目三:棋盘上马遍历问题
(1)问题描述
在8*8方格的棋盘上,从任意指定的方格出发,为马寻找一条走遍棋盘每一个并且只能经过一次的一条路径。
(2)算法分析
如果用二维数组board[][]表示棋盘,其元素记录马经过该位置时的步骤号。另对马的各种可能的走法设定一个检索次序,确定了出发方格后首先要清盘,即将表示棋盘的二维数组每个元素都置0;第一步就是出发方格,主要是确定第二步到第六十四步。先找到马当前所在的各种可能的出口;该题中运用贪婪法多个出口中确定一个出口,选择下一个出口的贪婪标准是那些允许走的位置中选择下一个出口最少的那个位置,如马当前的位置在(i,j)只有三个出口,它们的位置是(i+2,j+1)、(i-2,j+1)和(i-1,j-2),如分别走到这三个位置,这三个位置又分别会有不同的出口,假定这三个位置的出口个数分别为4、2、3,则程序就选择让走向出口个数最少的(i-2,j+1)位置。该过程没有回溯,但对于某些开始位置实际上有解,而该算法不能找到解,对于这种情况,只要改变八种可能出口的选择顺序就能找到解。
数据分析
(3)源代码
#include<stdio.h>
#include<stdlib.h>
int chess[14][13]; //定义棋盘
int CanPath[14][13][8]; //每个棋子的八个方向哪些可以走
typedef struct{ //棋盘的八个方向
int x,y;
}direction;
direction dir[8]={
{
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 struct{
pathnode pa[90];
int top;
}path; //顺序栈
void Init_Path(path *p)
{ //初始化栈
p->top=-1;
}
int Push_Path(path