算法题每日一练---第35天: 机器人走迷宫

661 阅读1分钟

「这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战

一、问题描述

1.png 一个机器人位于一个 m x n **网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

题目链接:机器人走迷宫

二、题目要求

考察

1.动态规划中等题型
2.建议用时5~15min

数据要求

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

样例

m=3,n=7     输出28
m=3,n=2     输出3
m=3,n=3     输出6

三、问题分析

这也是一道比较典型的动态规划问题,动态规划没做过的可以看这一篇入门:

算法题每日一练---第34天: 青蛙跳台阶

还是用我们的三步走老套路:

第一步含义搞懂:

这是二维数组,要求出不同路径,那么就用二维数组 dp[i][j]存储不同的路径个数。

第二步变量初始:

dp[1][1]=1 原地踏步不就是吗?
一步步写太多了,不想写了,我放一个编译结果图片,偷懒一下。

2.png 周围一圈都是初始化0

第三步规律归纳:

看看上面的图片有什么特别的地方,有时间可以自己动手写一下,印象会更加深刻,当时我就写了一遍。

是不是当前数组位置的到数 = 左面的数字 + 上面的数字啊!

所以dp[m][n]=dp[m][n-1]+dp[m-1][n];

三步走,打完收工!

四、编码实现

#include<iostream>
using namespace std;
int uniquePaths(int m, int n) 
{
    int i,j,dp[102][102]={0};//初始化变量
    for(i=1;i<=m;i++)//循环判断
    {
        for(j=1;j<=n;j++)
        {
            if(i==1&&j==1)
                {
                    dp[1][1]=1;//初始化变量
                }
            else
                dp[i][j]=dp[i][j-1]+dp[i-1][j];//规律归纳
        }
    }
//    for(i=0;i<=m;i++)//输出当前数组元素的值
//    {
//        for(j=0;j<=n;j++)
//        {
//            cout<<dp[i][j]<<"      ";
//        }cout<<"\n";
//    }
    return dp[m][n];//返回结果
}
int main()
{
	int m,n;
	cin>>m>>n;//输入数组大小
	cout<<uniquePaths(m, n) ;//赋值给动态规划功能的函数
	return 0;
}

五、测试结果

输入3 7: 3.png