象棋中马只能走日, 给你任意一个点(x, y),问你马从左下角走到这个点且只能走k步,问走到这个点的方法数有多少种? ps: 棋盘是10行9列的
public static int ways(int x, int y, int k) {
return f(x, y, k);
}
private static int f(int x, int y, int k) {
if (k == 0) {
return x == 0 && y == 0 ? 1 : 0;
}
if (x < 0 || x > 9 || y < 0 || y > 8) {
return 0;
}
return f(x - 2, y - 1, k - 1)
+ f(x - 2, y + 1, k - 1)
+ f(x - 1, y + 2, k - 1)
+ f(x + 1, y + 2, k - 1)
+ f(x + 2, y + 1, k - 1)
+ f(x + 2, y - 1, k - 1)
+ f(x + 1, y - 2, k - 1)
+ f(x - 1, y - 2, k - 1);
}
改动态规划
public static int ways2(int x, int y, int k) {
int[][][] dp = new int[10][9][k + 1];
dp[0][0][0] = 1;
for (int level = 1; level <= k; level++) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 9; j++) {
dp[i][j][level] = getValue(i - 2, j - 1, level - 1, dp)
+ getValue(i - 2, j + 1, level - 1, dp)
+ getValue(i - 1, j + 2, level - 1, dp)
+ getValue(i + 1, j + 2, level - 1, dp)
+ getValue(i + 2, j + 1, level - 1, dp)
+ getValue(i + 2, j - 1, level - 1, dp)
+ getValue(i + 1, j - 2, level - 1, dp)
+ getValue(i - 1, j - 2, level - 1, dp);
}
}
}
return dp[x][y][k];
}
public static int getValue(int x, int y, int k, int[][][] dp) {
if (x < 0 || x > 9 || y < 0 || y > 8) {
return 0;
}
return dp[x][y][k];
}