中国象棋 在从0,0 象棋马经过k步到达某一点的方法数量

package com.trs.codetool.core;

/**
* 2020/07/20
* 中国象棋 在从0,0 象棋马经过k步到达某一点的方法数量
*/
public class KStepMa {
public static void main(String[] args) {
// x,y 代表终点位置 k代表总共k步
int x = 2,y = 3,k = 3;
// 递归的方式
//int num = getWay1(x,y,k);
// 动态规划的方式
int num = getWay2(x,y,k);
// 动态规划的方式
System.out.println("调到指定方法数:"+ num);
}

/**
* 动态规划的方式
* @param x
* @param y
* @param k
* @return
*/
private static int getWay2(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+1;level++) {
for(int i=0;i<10;i++) {
for(int j = 0;j<9;j++) {
if(x < 0 || y < 0 || x > 9 || y >8) {
dp[i][j][level] = 0;
continue;
}
else {
dp[i][j][level] = getValue(dp,i+2,j-1,level-1)
+ getValue(dp,i+2,j+1,level-1)
+ getValue(dp,i+1,j+2,level-1)
+ getValue(dp,i-1,j+2,level-1)
+ getValue(dp,i-2,j+1,level-1)
+ getValue(dp,i-2,j-1,level-1)
+ getValue(dp,i-1,j-2,level-1)
+ getValue(dp,i+1,j-2,level-1);
}
}
}
}
for(int i=0;i<10;i++) {
for(int j=0;j<9;j++) {
System.out.println("i:"+i+"j:"+j+ "result:"+ dp[i][j][k]);
}
}
return dp[x][y][k];
}
public static int getValue(int[][][] dp,int x,int y,int z) {
if(x < 0 || y < 0 || x > 9 || y >8) {
return 0;
}
return dp[x][y][z];
}
/**
* 递归的方式
* @param x
* @param y
* @param k
* @return
*/
private static int getWay1(int x, int y, int k) {
if(k == 0) {
return (x == 0 && y == 0) ? 1 : 0;
}
if(x < 0 || y < 0 || x > 9 || y >8) {
return 0;
}
return getWay1(x+2,y-1,k-1)
+ getWay1(x+2,y+1,k-1)
+ getWay1(x+1,y+2,k-1)
+ getWay1(x-1,y+2,k-1)
+ getWay1(x-2,y+1,k-1)
+ getWay1(x-2,y-1,k-1)
+ getWay1(x-1,y-2,k-1)
+ getWay1(x+1,y-2,k-1);


}
}
原文地址:https://www.cnblogs.com/zcg1051980588/p/13330228.html