练习暴力递归和动态规划习题

129 阅读1分钟

假设棋盘是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));
    }