象棋馬走

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

  

  

posted @ 2021-10-13 09:45  sherry001  阅读(56)  评论(0编辑  收藏  举报