1.问题描述
骑士旅游Knight tour在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋 棋的走法,骑士可以由任一个位置出发,它要如何走完所有的位置。
2.基本思路
骑士的走法,基本上可以用递回来解决,但是纯粹的递回在维度大时相当没有效率,一个聪明的解法由J.CWarnsdorff 在1823年提出, 简单地说,先将最难的位置走完,接下来的路就宽广了,骑士所想要的下一步,为下一不再 选 择时,所能走的步数最少的一步。使用这个方法,在不使用递回的情况下,可以有较高的机率找出走法(找不到走 的机率也是有的)
3.代码实现
#include <stdio.h>
int pos[8][8] = { 0 };
int travel(int, int);
int travel(int x, int y) {
int i, j, k, l, m;
int tmpX, tmpY;
int count, min, tmp;
//骑士可走的八个方向(顺时针)
int ktmoveX[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
int ktmoveY[8] = { -2, -1, 1, 2, 2, 1, -1, -2 };
//测试下一步坐标
int nextX[8] = { 0 };
int nextY[8] = { 0 };
//记录每个方向的出路的个数
int exists[8] = { 0 };
//起始用1标记位置
i = x;
j = y;
pos[i][j] = 1;
//遍历棋盘
for (m = 2; m <= 64; m++)