中國象棋 在從0,0 象棋馬經過k步到達某一點的方法數量
阿新 • • 發佈:2020-07-17
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);
}
}