问题:在一个 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]);
}
}
原文:http://www.cnblogs.com/satchel/p/7471299.html