计算中的一个经典问题是骑士之旅,其中骑士访问棋盘上的每个方块;目标是按顺序列出骑士的动作。有两种类型的巡游:循环巡游(或闭合巡游),其中最后一个方块是骑士从起始方块跳出的地方,以及非循环巡视(或开放巡视),其中最终一个方块不受约束。除了标准的8×8棋盘外,骑士之旅通常针对一般棋盘,如5×5或10×12棋盘。
简单的解决方案是通过回溯:做出任何有效的举动。然后再做一个动作。依此类推,直到你完成整个旅程。如果在任何时候都没有有效的移动,请回溯并选择其他移动。下图显示了一个8乘8的循环巡视示例,电路板下面的列表显示了按访问顺序使用行和列坐标的方块列表:
01 16 51 34 03 18 21 36
50 33 02 17 52 35 04 19
15 64 49 56 45 20 37 22
32 55 44 63 48 53 42 05
61 14 57 54 43 46 23 38
28 31 62 47 58 41 06 09
13 60 29 26 11 08 39 24
30 27 12 59 40 25 10 07
0/0 1/2 0/4 1/6 3/7 5/6 7/7 6/5
5/7 7/6 6/4 7/2 6/0 4/1 2/0 0/1
1/3 0/5 1/7 2/5 0/6 2/7 4/6 6/7
7/5 6/3 7/1 5/0 6/2 7/0 5/1 3/0
1/1 0/3 1/5 0/7 2/6 4/7 6/6 7/4
5/5 3/6 4/4 3/2 2/4 4/5 5/3 3/4
2/2 1/0 0/2 1/4 3/5 4/3 3/1 2/3
4/2 5/4 7/3 6/1 4/0 5/2 3/3 2/1
由于可能的旅行数量非常大,简单的解决方案可能需要很长时间。1823年,H.C.von Warnsdorff提出了以下启发:根据后续移动的数量对有效移动进行排序,首先选择后续移动数量最少的移动(如果出现平局,则随机选择)。在小棋盘上,比如说小于10乘10的棋盘,Warnsdorff的启发式经常会完全消除回溯。
您的任务是编写一个程序,在n个-由-n个棋盘。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。
页:1 2