zoukankan      html  css  js  c++  java
  • 剑指offer-机器人的运动范围(DFS)

    描述

    地上有一个rows行和cols列的方格。坐标从 [0,0] 到 [rows-1,cols-1]。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于threshold的格子。 例如,当threshold为18时,机器人能够进入方格[35,37],因为3+5+3+7 = 18。但是,它不能进入方格[35,38],因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
     
    求解思路:
    1. 首先确定DFS的思路,
    2. 一个格子有上下左右四个方向,但其实我们只需要关注右下两个方向就行

    代码:

     1 class Solution {
     2 private:
     3     int count=0;
     4 public:
     5     int movingCount(int threshold, int rows, int cols) {
     6         if(threshold<=0){
     7             return 1;
     8         }
     9         // 能用向量尽量用向量,初始化都简单很多
    10 //         bool** flag=new bool*[rows];
    11 //         for(int i=0;i<rows;++i){
    12 //             flag[i]=new bool[cols];
    13 //             for(int j=0;j<cols;++j){
    14 //                 flag[i][j]=false;
    15 //             }
    16 //         }
    17         vector<vector<bool>> flag(rows,vector<bool>(cols,false));
    18         DFS(threshold,flag,0,0,rows,cols);
    19         return count;
    20     }
    21     
    22     // count已经是成员变量了,不需要返回
    23     // 递归中改变参数的值:静态变量、成员变量、引用
    24     void DFS(int ths,vector<vector<bool>>& flag, int x,int y,int rs,int cs){
    25         if(getSum(x,y)>ths || rs<=x || cs<=y || flag[x][y]){
    26             return;
    27         }
    28         flag[x][y]=true;
    29         count+=1;
    30         DFS(ths,flag,x+1,y,rs,cs); // 只需关注向右递归
    31         DFS(ths,flag,x,y+1,rs,cs); // 只需关注向下递归
    32     }
    33     
    34     // 计算两个数字的位数和
    35     int getSum(int nr,int nc){
    36         int res=0;
    37         while(nc>0){
    38             res+=nc%10;nc/=10;
    39         }
    40         while(nr>0){
    41             res+=nr%10;nr/=10;
    42         }
    43         return res;
    44     }
    45 };

    心得:

    1. 递归中改变参数的三种方式:成员变量、静态变量、引用
    2. 尽量用向量而非数组
    3. 尽量让代码更简介(如计算两个数字的位数之和,明显有冗余代码),更有逻辑性。
    心之所愿,永不相忘
  • 相关阅读:
    SQL查询语句中,any和all有什么区别?
    $(function(){...});
    在ASP.NET中TextBox和TextBoxFor的区别以及ValidationMessageFor的作用以及EditorFor等的作用和用法什么?
    Brt课程设计day3
    Brt课程设计day2
    day1
    .net 高级写法总结
    可能是目前最完整的前端框架 Vue.js 全面介绍
    redis live 如何安装
    百万级PHP网站架构工具箱
  • 原文地址:https://www.cnblogs.com/zgll/p/15117224.html
Copyright © 2011-2022 走看看