麦兜

1542 分类: 算法

1194:移动路线 (暴力解决转换到递推)

【题目描述】

X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。

小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右移动。小明把这只蚂蚁放在左下角的方格中,蚂蚁从

左下角的方格中移动到右上角的方格中,每步移动一个方格。蚂蚁始终在方格矩阵内移动,请计算出不同的移动路线的数目。

对于1行1列的方格矩阵,蚂蚁原地移动,移动路线数为1;对于1行2列(或2行1列)的方格矩阵,蚂蚁只需一次向右(或向上)移动,移动路线数也为1……对于一个2行3列的方格矩阵,如下图所示:

(2,1) (2,2) (2,3)
(1,1) (1,2) (1,3)

蚂蚁共有3种移动路线:

路线1:(1,1) → (1,2) → (1,3) → (2,3)

路线2:(1,1) → (1,2) → (2,2) → (2,3)

路线3:(1,1) → (2,1) → (2,2) → (2,3)

【输入】

输入只有一行,包括两个整数m和n(0 < m+n ≤ 20),代表方格矩阵的行数和列数,m、n之间用空格隔开。
【输出】

输出只有一行,为不同的移动路线的数目。
【输入样例】

2 3

【输出样例】

3

这个可以 暴力解决也可以推算。

暴力解决代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int sum = 0;
int m, n;
void f(int i, int j)
{
    if (i > m || j > n)
        return;
    
    if (i == m&&j == n)
    {
        sum++;
        return;
    }

    f(i + 1, j);
    f(i, j + 1);
}
int main()
{

    cin >> n >> m;
    f(1,1);
    cout << sum;
}

推算

1.png
2.png
3.png

递推代码参考

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int main()
{
    int arr[21][21];
    for (int i = 0; i < 21; i++)arr[0][i] = 1;  /*填充 1行N列*/
    for (int i = 0; i < 21; i++)arr[i][0] = 1;  /*填充 M行1列*/
    for (int i = 1; i < 21; i++)
    {
        for (int j = 1; j < 21; j++)
        {  
            arr[i][j] = arr[i - 1][j] + arr[i][j - 1];  /*规律*/
        }
    }
    int m, n;
    cin >> m >> n;
    cout << arr[m-1][n-1];
}

#none

作者: 麦兜

版权: 除特别声明,均采用BY-NC-SA 4.0许可协议,转载请表明出处

目录Content

评论