• (动态规划)机器人走迷宫问题


    • 题目一:https://www.nowcoder.com/practice/166eaff8439d4cd898e3ba933fbc6358?tpId=46&tqId=29117&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

    • 题目翻译:
      机器人位于m x n网格的左上角(在下图中标记为“开始”)。
      
      机器人只能在任何时间点向下或向右移动。 机器人试图到达网格的右下角(在下图中标记为“完成”)。
      
      有多少个可能的唯一路径?
      
      上面是一个3×7的网格。 有多少个可能的唯一路径?
      
      注意:m和n最多为100。
    • 思路:这道题目是一道典型的动态规划问题。从多个小问题的解的合并能够解决最终原问题的解。得出的递推式:res[i][j] = res[i-1][j] + res[i][j-1];  初始化的时候将res二维数组的第一行第一列都置为1,方便计算。
    • 代码:
      class Solution {
      public:
          int uniquePaths(int m, int n) {
             vector<vector<int>> res(m, vector<int>(n, 1));// 初始化二维数组  
             for (int i = 1; i<m ; i++)
                 for (int j = 1; j<n; j++){
                 res[i][j] = res[i-1][j] + res[i][j-1];
             }
              return res[m-1][n-1];
          }
      };
    • 题目二:https://www.nowcoder.com/practice/3cdf08dd4e974260921b712f0a5c8752?tpId=46&tqId=29116&tPage=4&rp=4&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
    • 题目翻译:
      唯一路径”的后续跟踪:
      
      现在考虑如果一些障碍物添加到网格。 有多少独特的路径会有?
      
      障碍物和空白区域在网格中分别标记为1和0。
      
      例如,
      
      在3x3网格的中间有一个障碍物,如下所示。
      
      [
         [0,0,0],
         [0,1,0],
         [0,0,0]
      ]]
      
      唯一路径的总数为2。
      
      注意:m和n最多为100。
    • 思路:这道题其实是上面那个题目的衍生,方法肯定还是dp,但是要对出现障碍物的位置进行特殊处理。试想当只有一行的时候,某个障碍物出现,那么到达路径为0.只有一列的时候也是一样。所以首先初始化的时候对第一行第一列上面出现障碍物的地方将path[i][0]  和path[0][i]都置为0.然后我们还是利用上面的递推式进行计算:res[i][j] = res[i-1][j] + res[i][j-1]。循环计算的时候如果碰到障碍物,就将path[i][j]置为0.这样就解决了这个问题。
    • 代码:
      class Solution {
      public:
          int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
              int row = obstacleGrid.size();
              int col = obstacleGrid[0].size();
              
              vector<vector<int> > res(row, vector<int>(col, 0));
              for (int i=0; i<col; i++){//处理列
                  res[0][i] = 1;
                  if (obstacleGrid[0][i] == 1){
                      res[0][i] = 0;
                      break;
                  } 
              }
              for (int i=0; i<row; i++){//处理列
                  res[i][0] = 1;
                  if (obstacleGrid[i][0] == 1){
                      res[i][0] = 0;
                      break;
                  } 
              }
              
              for (int i=1; i<row; i++){
                  for (int j=1; j<col; j++){
                      res[i][j] = res[i-1][j] + res[i][j-1];
                      if (obstacleGrid[i][j] == 1)
                          res[i][j] = 0;
                  }
              }
              return res[row-1][col-1];
          }
      };
  • 相关阅读:
    C#面向过程之类型转换、算术运算符、关系运算符、逻辑运算符、if-else语句、switch-case、循环结构(while、for)、三元表达式
    C#面向过程之编译原理、变量、运算符
    VS快捷键整理
    简单聊聊mybatis插件(附源码)
    高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)
    聊聊js运算符 ‘与(&&)’和‘ 或(||)’
    从内部剖析C# 集合之--Dictionary
    从内部剖析C# 集合之---- HashTable
    字符串查找和函数操作题目解析
    常用排序算法实现
  • 原文地址:https://www.cnblogs.com/Kobe10/p/6357526.html
Copyright © 2020-2023  润新知