问题描述:中国象棋中,马可以走遍棋盘上的任何角落.国际象棋中,也同样有这样的说法:骑士可以走遍棋盘上的每个格子.现在的问题是:在一个8x8的棋盘上,从任意位置开始,骑士如何可以不重复地走完所有的位置?
骑士在每一步都有8种可能的下一步走法(边界上除外),为了提高效率,可以选择所要走的下一步为下一步要选择时所能走的步数最少的一步.
函数说明:
bool travel(int board[][SIZE],int x,int y); //遍历函数,传入数组表示棋盘,x,y表示骑士的初始位置坐标
具体步骤:
首先记录当前位置走的次序,然后遍历棋盘,得到可能的下一跳数目,通过min函数找到最合适的下一跳,记录下一跳位置走的次序.如果能够遍历完成,返回true表示骑士不重复的走完棋盘.
int possible(int board[][SIZE],int *nexti,int *nextj,int x,int y);//计算下一步的可能方向,传入数组表示棋盘,数组记录多个下一步可能方向,x,y为当前骑士位置坐标
具体步骤:
将所有的下一跳以坐标表示,若当前位置上下一跳的元素值为0表示未走过为一种可能方向,下一跳数组记录下一跳坐标,计数器累加,返回计数器
int min(int board[][SIZE],int *nexti,int *nextj,int count); //从多个可能方向中找出下一方向数最少的方向
具体步骤:
在所有的可能的方向中遍历,分别计算下一跳的数目,取其中最小数目的方向,返回值表示下一跳数组的下标
C++代码: