象棋馬走
象棋馬走日在(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]; }