初学java,刚好再学习一下有关深度优先搜索。
以下使用java实现了一下简单的马踏棋盘的问题:
public class HourseChess {
static final int SIZE = 8;
private static boolean found = false; // 是否完成
public static void main(String[] args) {
byte[][] chess = new byte[SIZE][SIZE]; // 建立棋盘
dfs(5, 3, 1, chess); // 暴力递归
for(byte[] x: chess) {
for(byte y: x) {
System.out.print("\t" + y);
}
System.out.print("\n");
}
}
/**
*
* 深度优先搜索遍历棋盘
*/
public static void dfs(int i, int j, int n, byte[][] c) {
c[i][j] = (byte)n; // 记录当前步骤
// 开始判断下一步,使用了if...顺序是固定的
if(i - 1 >= 0 && j - 2 >= 0 && c[i - 1][j - 2] == 0) {
dfs(i - 1, j - 2, n + 1, c);
}
if(i + 1 < SIZE && j - 2 >= 0 && c[i + 1][j - 2] == 0) {
dfs(i + 1, j - 2, n + 1, c);
}
if(i + 2 < SIZE && j - 1 >= 0 && c[i + 2][j - 1] == 0) {
dfs(i + 2, j - 1, n + 1, c);
}
if(i + 2 < SIZE && j + 1 < SIZE && c[i + 2][j + 1] == 0) {
dfs(i + 2, j + 1, n + 1, c);
}
if(i + 1 < SIZE && j + 2 < SIZE && c[i + 1][j + 2] == 0) {
dfs(i + 1, j + 2, n + 1, c);
}
if(i - 1 >= 0 && j + 2 < SIZE && c[i - 1][j + 2] == 0) {
dfs(i - 1, j + 2, n + 1, c);
}
if(i - 2 >= 0 && j + 1 < SIZE && c[i - 2][j + 1] == 0) {
dfs(i - 2, j + 1, n + 1, c);
}
if(i - 2 >= 0 && j - 1 >= 0 && c[i - 2][j - 1] == 0) {
dfs(i - 2, j - 1, n + 1, c);
}
// 此处表明递归到底了, 此马已无路可走
if(n >= SIZE * SIZE) { // 如果棋盘已经全部走完
found = true;
}
if(!found) { // 否则恢复棋盘步骤, 返回上层, 继续搜索
c[i][j] = 0;
}
}
}