骑士周游问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了骑士周游问题相关的知识,希望对你有一定的参考价值。

问题:在一个 8*8 的棋盘上,马按照“日”字走,给定一个起点,打印出马不重复的走完棋盘64个格子的路径。

  解答:递归 + 回溯 (对于任一步,马能走的下一步有8个方向,但是需要满足两个条件:1. 格子在棋盘内, 2. 格子没有被访问过),回溯的原因是,每次选择一个方向,有可能会走到死胡同。这时候就需要回溯,重新选择方向。

代码:

public static int[][] jump = {{2,1}, {1,2}, {-1,2}, {-2,1}, {-2,-1}, {-1,-2}, {1,-2}, {2,-1}};   // 每次的8个方向,保存在数组中
public static int[][] path = new int[64][2];    // 记录路径

public static boolean check (int x, int y, int[][] visited) {
	if (x >= 0 && x <= 7 && y >= 0 && y <= 7 && visited[x][y] == 0) {
		return true;
	}
	return false;
}

public static int horse (int x, int y, int[][] visited,  int cnt) {
	if(cnt==64) return cnt;
	for(int i = 0; i < 8; i++) {
		if (check(x+jump[i][0], y+jump[i][1], visited)) {
			x = x+jump[i][0];
			y = y+jump[i][1];
			visited[x][y] = 1;
			path[cnt][0] = x;
			path[cnt][1] = y;
			if (horse(x, y, visited, ++cnt) != 0) {
				return 1;        // 能继续走下去
			}
               // 否则,执行如下代码,即回溯(把状态恢复到递归之前,进行下一步的方向选择) cnt--; visited[x][y] = 0; x = x-jump[i][0]; y = y-jump[i][1]; } } return 0; } public static void main(String[] args) { int[][] visited = new int[8][8]; visited[0][0] = 1; System.out.println(horse(0, 0, visited, 1)); for (int[] i : path) { System.out.print(" " + i[0] + i[1]); } }

  

  

以上是关于骑士周游问题的主要内容,如果未能解决你的问题,请参考以下文章

骑士周游问题

第28章 算法优化体验课 - 骑士周游问题

小甲鱼数据结构和算法--马踏棋盘(骑士周游问题)

程序员必会十大算法之骑士周游问题

算法马踏棋盘算法 骑士走周游算法

45-骑士周游问题