问题:在一个 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]); } }
时间: 2024-12-19 14:10:18