假设棋盘是10行9列,马从(0,0)出发,跳k步到(x,y),请回答一共有多少种跳法?分别用暴力递归和动态规划写出。
暴力递归解答:
/**
* ***1*1***
* **1***1**
* ****d****
* **1***1**
* ***1*1***
* @param x
* @param y
* @param k
* @return
*/
public static int getNum(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 getNum(x+2,y-1,k-1)+getNum(x+2,y+1,k-1)+getNum(x+1,y-2,k-1)+getNum(x+1,y+2,k-1)
+getNum(x-1,y-2,k-1)+getNum(x-1,y+2,k-1)+getNum(x-2,y-1,k-1)+getNum(x-2,y+1,k-1);
}
动态规划改写:
public static int getNum1(int x1,int y1,int k1){
int[][][] temp = new int[10][9][k1+1];
temp[0][0][0] = 1;
for(int k=1;k<=k1;k++){
for(int x=0;x<10;x++){
for(int y=0;y<9;y++){
temp[x][y][k] = getValue(temp,x+2,y-1,k-1)+getValue(temp,x+2,y+1,k-1)+getValue(temp,x+1,y-2,k-1)+getValue(temp,x+1,y+2,k-1)
+getValue(temp,x-1,y-2,k-1)+getValue(temp,x-1,y+2,k-1)+getValue(temp,x-2,y-1,k-1)+getValue(temp,x-2,y+1,k-1);
}
}
}
return temp[x1][y1][k1];
}
public static int getValue(int[][][] temp,int x,int y,int k){
if(x<0 || x>9 || y<0 || y>8) return 0;
return temp[x][y][k];
}
测试方法:
public static void main(String[] args) {
int x = 3;
int y = 3;
int k =10;
System.out.println(getNum(x,y,k));
System.out.println(getNum1(x,y,k));
}