象棋中马只能走日, 给你任意一个点(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];}
