象棋馬走
象棋馬走日在(0,0)走K步后到(a,b)的方法数

public static int process(int i,int j,int step){
if(i<0||i>9||j<0||j>8){
return 0;
}
if(step==0){
return (i==a&&j==b)?1:0;
}
return process(i-2,j-1,step-1)
+process(i-2,j+1,step-1)
+process(i-1,j-2,step-1)
+process(i-1,j+2,step-1)
+process(i+1,j-2,step-1)
+process(i+2,j+1,step-1);
}
转动态规划
public static int process2dp(int s){
int[][][] dp=new int[10][9][s+1];
dp[a][b][0]=1;
for(int step=1;step<=s;step++){
for(int i=0;i<10;i++){
for(int j=0;j<9;j++){
dp[i][j][step]=getValue(dp,i-2,j-1,step-1)
+getValue(dp,i-2,j+1,step-1)
+getValue(dp,i-1,j-2,step-1)
+getValue(dp,i-1,j+2,step-1)
+getValue(dp,i+1,j-2,step-1)
+getValue(dp,i+2,j+1,step-1);
}
}
}
return dp[0][0][s];
}
public static int getValue(int[][][] dp,int r,int c,int step){
if(r<0||r>9||c<0||c>8){
return 0;
}
return dp[r][c][step];
}

浙公网安备 33010602011771号