暴力递归到动态规划

象棋中马的跳法

【题目】

请同学们自行搜索或者想象一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下 角是(0,0)位置。

那么整个棋盘就是横坐标上9条线、纵坐标上10条线的一个区域。

给你三个 参数,x,y,k,返回如果“马”从(0,0)位置出发,必须走k步,最后落在(x,y)上的方法数 有多少种?

 

暴力递归

思路:

定义一个8*9的棋盘,然后边界限制,不能跳的超出棋盘

当step 步数到0的时候,i,j 的位置也到达了 目标位置 a,b的时候,表示为一种有效方法

然后调递归不断的尝试,一共8个位置。

 

int process(int i, int j, int step,int a,int b)
{
    if (i < 0 || i > 8 || j < 0 || j > 9)
    {
        return 0;
    }
    if (step == 0)
    {
        return (i == a && j == b) ? 1 : 0;
    }
    return process(i - 1, j - 2, step - 1, a, b)
        + process(i - 2, j - 1, step - 1, a, b)
        + process(i - 2, j + 1, step - 1, a, b)
        + process(i - 1, j + 2, step - 1, a, b)
        + process(i + 1, j - 2, step - 1, a, b)
        + process(i + 2, j - 1, step - 1, a, b)
        + process(i + 2, j + 1, step - 1, a, b)
        + process(i + 1, j + 2, step - 1, a, b);
}

 

机器人达到指定位置方法数

【题目】 假设有排成一行的 N 个位置,记为 1~N,N 一定大于或等于 2。开始时机器人在其中的 M 位 置上(M 一定是 1~N 中的一个),机器人可以往左走或者往右走,如果机器人来到 1 位置, 那 么下一步只能往右来到 2 位置;如果机器人来到 N 位置,那么下一步只能往左来到 N-1 位置。 规定机器人必须走 K 步,最终能来到 P 位置(P 也一定是 1~N 中的一个)的方法有多少种。给 定四个参数 N、M、K、P,返回方法数。

【举例】 N=5,M=2,K=3,P=3 上面的参数代表所有位置为 1 2 3 4 5。机器人最开始在 2 位置上,必须经过 3 步,最后到 达 3 位置。走的方法只有如下 3 种: 1)从2到1,从1到2,从2到3 2)从2到3,从3到2,从2到3 3)从2到3,从3到4,从4到3 所以返回方法数 3。 N=3,M=1,K=3,P=3 上面的参数代表所有位置为 1 2 3。机器人最开始在 1 位置上,必须经过 3 步,最后到达 3 位置。怎么走也不可能,所以返回方法数 0。

 

暴力递归

int walk(int n, int cur, int rest, int p)
{
    if (rest == 0)
    {
        return cur == p ? 1 : 0;
    }
    if (cur == 1)
    {
        return walk(n, 2, rest - 1, p);
    }
    if (cur == n)
    {
        return walk(n, n - 1, rest - 1, p);
    }
    return walk(n, n + 1, rest - 1, p) + walk(n, n - 1, rest - 1, p);
}

int f(int n, int start, int end, int k, int p)
{
    if (n < 2 || k<1 || start>n || p<1 || p>n)
    {
        return 0;
    }
    return walk(n, start, k, p);
}

 

 

换钱的最少货币数

【题目】 给定数组 arr,arr 中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值 的货币可以使用任意张,再给定一个整数 aim,代表要找的钱数,求组成 aim 的最少货币 数。

【举例】 arr=[5,2,3],aim=20。 4 张 5 元可以组成 20 元,其他的找钱方案都要使用更多张的货币,所以返回 4。 arr=[5,2,3],aim=0。 不用任何货币就可以组成 0 元,返回 0。 arr=[3,5],aim=2。 根本无法组成 2 元,钱不能找开的情况下默认返回-1。

 

暴力递归

int process(int array[], int index, int aim,int len)
{
    if (index == len)
    {
        return aim == 0 ? 1 : 0;
    }
    int ways = 0;
    for (int zhang = 0; zhang*array[index] <= aim; zhang++)
    {
        ways += process(array, index + 1, aim - zhang * array[index],len);
    }
    return ways;
}

 

 

Bob的生存概率

【题目】 给定五个参数n,m,i,j,k。表示在一个N*M的区域,Bob处在(i,j)点,每次Bob等概率的向上、 下、左、右四个方向移动一步,Bob必须走K步。如果走完之后,Bob还停留在这个区域上, 就算Bob存活,否则就算Bob死亡。请求解Bob的生存概率,返回字符串表示分数的方式。

 

暴力递归

int process(int i, int j, int n, int m, int k)
{
    if (n < 0 || i == n || m < 0 || j == m)
    {
        return 0;
    }
    if (k == 0)
    {
        return 1;
    }
    int live = process(i, j, n - 1, m, k - 1)
        + process(i, j, n + 1, m, k - 1)
        + process(i, j, n, m + 1, k - 1)
        + process(i, j, n, m - 1, k - 1);
    return live;
}

 

上一篇:Python:SyntaxError: keyword can't be an expression


下一篇:量子纠缠和游戏有什么关系?道翰天琼认知智能机器人平台API接口大脑为您揭秘。