zoukankan      html  css  js  c++  java
  • LeetCode LCP 3 机器人大冒险

    题目解析:

    对于本题主要的核心是对于一个指令字符串如“RURUU”,如果我们假设它的终点坐标为(8,8),其实只要统计指令字符串中的R的个数和U的个数(对于我给出的例子而言,num_R == 2,num_U == 3),显然不管我们是否能到达终点,这条指令至少要走不止一遍才有可能,那么我们只要将它在达到终点前必走的x轮减去(对于我给出的例子而言x == min(8 / 2 ,8 / 3)== 2,则忽略中间走的轮数,就能把终点的位置转化为(4,2)),则就能求出最后那不足一轮的情况下需要U多少个,R多少个才能到达终点,然后遍历指令字符串,一步一步模拟即可,一旦超过终点的x或者y则永远不可能到达,对于障碍点来说也是一样,把它们当作目标点来求能否到达即可,这个判断的过程可以单独写作一个函数更为方便。解题时,我们先判断障碍点(x <= 终点x,y <= 终点y,否则根据题意,该障碍点无效)能否到达,在所有有必要判断的障碍点都不会碰到后再判断终点能否到达

    本题代码:

     1 class Solution {
     2 public:
     3     int min(int x, int y){
     4         return x < y ? x : y;
     5     }
     6     bool judge(string command, int x_num, int y_num, int x, int y){
     7         int temp = min(x/x_num, y/y_num);       //temp记录最小公倍数
     8         x = x - x_num*temp;      //x记录的是R
     9         y = y - y_num*temp;      //y记录的是U
    10         //此时的x和y代表终点相对于第一次循环的位置
    11         if(x == 0 && y == 0) return true;
    12         else{
    13             int len_cmd = command.size();
    14             for(int i = 0; i < len_cmd; i++){
    15                 if(command[i] == 'U'){
    16                     y--;
    17                     if(y < 0) return false;
    18                 }else{
    19                     x--;
    20                     if(x < 0) return false;
    21                 }
    22                 if(x == 0 && y == 0) return true;
    23             }
    24         }
    25         return true;
    26     }
    27     bool robot(string command, vector<vector<int>>& obstacles, int x, int y) {
    28         int len_cmd = command.size();
    29         int x_1 = 0;
    30         int y_1 = 0;
    31         //统计第一轮循环能走到的地方
    32         for(int i = 0; i < len_cmd; i++){
    33             if(command[i] == 'R'){
    34                 x_1++;
    35             }else{
    36                 y_1++;
    37             }
    38         }
    39         //把每一个障碍点(该障碍点的x和y都要小于终点的x和y)当做是终点求能否到达 能到达则return false
    40         int len_obs = obstacles.size();
    41         for(int i = 0; i < len_obs; i++){
    42             if(obstacles[i][0] <= x && obstacles[i][1] <= y){
    43                 //能到达则return false
    44                 if(judge(command, x_1, y_1, obstacles[i][0], obstacles[i][1]) == true) return false;
    45             }
    46         }
    47         //如果所有的终点之内的障碍点都不会到达 则直接判断终点是否可以到达
    48         if(judge(command, x_1, y_1, x, y) == true) return true;
    49         else return false;
    50     }
    51 };
    如果有任何意见请在评论区积极留言
  • 相关阅读:
    Jackcard类似度和余弦类似度(向量空间模型)的java实现
    Android Wear之android穿戴式设备应用开发平台
    poj 2955 Brackets 括号匹配 区间dp
    Gradle自己定义插件
    C语言之基本算法11—牛顿迭代法求平方根
    jquery ajax实现省市二级联动
    从0開始学习 GitHub 系列之「07.GitHub 常见的几种操作」
    Android Widget和悬浮窗 原理
    怎样推断一个数的二进制有多少个1
    Mac OSX Yosemite 10.10 brew 错误:mktemp: mkdtemp failed on /tmp/git-LIPo: No such file or directory
  • 原文地址:https://www.cnblogs.com/YLTFY1998/p/11616836.html
Copyright © 2011-2022 走看看