zoukankan      html  css  js  c++  java
  • 874. 模拟行走机器人

     874. 模拟行走机器人

    描述:

    机器人在一个无限大小的网格上行走,从点?(0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令:

    -2:向左转90 度
    -1:向右转 90 度
    1 <= x <= 9:向前移动x个单位长度
    在网格上有一些格子被视为障碍物。

    第 i个障碍物位于网格点 ?(obstacles[i][0], obstacles[i][1])

    如果机器人试图走到障碍物上方,那么它将停留在障碍物的前一个网格方块上,但仍然可以继续该路线的其余部分。

    返回从移动过程中原点到机器人的最大欧式距离的平方。

    示例 1:

    输入: commands = [4,-1,3], obstacles = []
    输出: 25
    解释: 机器人将会到达 (3, 4)
    示例2:

    输入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
    输出: 65
    解释: 机器人在左转走到 (1, 8) 之前将被困在 (1, 4) 处

    提示:

    0 <= commands.length <= 10000
    0 <= obstacles.length <= 10000
    -30000 <= obstacle[i][0] <= 30000
    -30000 <= obstacle[i][1] <= 30000
    答案保证小于2 ^ 31

     1 解法1:112 ms    24.3 MB
     2 class Solution {
     3 public:
     4     int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
     5         //题目,是找移动过程中,到达原点的 最大欧式距离的平方
     6         //将数据 存入set,键值对中,方便判断
     7         //          0,1
     8         //           |
     9         //-1,0------0,0,-------1,0
    10         //           |
    11         //          0,-1
    12         //定义好移动的四个方向;可以使用取余的方法来判断,转向那个方向
    13         //(0,1)-->左转(-2)  --->x=(0+3)%4=3  ,dirx[3]=-1,
    14         //                  --->y=(1+3)%4=0,     diry[0]=1;
    15         //                  --->(x,y)=(-1,1);换方向了    
    16     //
    17         int dirx[4]={0,1,0,-1};
    18         int diry[4]={1,0,-1,0};
    19         //本想 用图,来做,但是,map<int,vector<int> > mp;这样麻烦,用set,unordered_set
    20         //unordered_set<pair<int,int>> st;
    21         set<pair<int,int> > st;//存储好,障碍点的坐标
    22         for(vector<int> &v:obstacles){
    23            st.insert({v[0],v[1]});
    24         }
    25         int x=0,y=0,dir=0,ans=0;
    26         for(int i=0;i<commands.size();i++){
    27             if(commands[i]==-2){//左转 90
    28                 dir=(dir+3)%4;//原来方向+3 %4 为现在的方向  
    29             }else if(commands[i]==-1){//右转 90
    30                 dir=(dir+1)%4;//原来方向+1 %4  为现在方向
    31             }else{//照着现在 方向遍历,移动位置
    32                 for(int j=0;j<commands[i];j++){
    33                     int nextx=x+dirx[dir];//下一个 方向 位置坐标
    34                     int nexty=y+diry[dir];
    35                     if(st.find({nextx,nexty})!=st.end()){//去查是否是障碍物
    36                         //有,跳出这一轮的移动
    37                         break;
    38                     }//否则,每次都计算,太耗时间了 ,可以将ans拿出去
    39                     x=nextx;//没有找到障碍物,那么更新当前位置
    40                     y=nexty;
    41                     ans=max(ans,x*x+y*y);//同时计算 最大值
    42                 }
    43             }
    44         }
    45         return ans;
    46     }
    47 };
     1 解法2:108 ms    24.4 MB    
     2 class Solution {
     3 public:
     4     int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
     5         //题目,是找移动过程中,到达原点的 最大欧式距离的平方
     6         //将数据 存入set,键值对中,方便判断
     7         //          0,1
     8         //           |
     9         //-1,0------0,0,-------1,0
    10         //           |
    11         //          0,-1
    12         //定义好移动的四个方向;可以使用取余的方法来判断,转向那个方向
    13         //(0,1)-->左转(-2)  --->x=(0+3)%4=3  ,dirx[3]=-1,
    14         //                  --->y=(1+3)%4=0,     diry[0]=1;
    15         //                  --->(x,y)=(-1,1);换方向了
    16         int dirx[4]={0,1,0,-1};
    17         int diry[4]={1,0,-1,0};
    18         //本想 用图,来做,但是,map<int,vector<int> > mp;这样麻烦,用set,unordered_set
    19         //unordered_set<pair<int,int>> st;
    20         set<pair<int,int> > st;//存储好,障碍点的坐标
    21         for(vector<int> &v:obstacles){
    22            st.insert({v[0],v[1]});
    23         }
    24         int x=0,y=0,dir=0,ans=0;
    25         for(int i=0;i<commands.size();i++){
    26             if(commands[i]==-2){//左转 90
    27                 dir=(dir+3)%4;//原来方向+3 %4 为现在的方向
    28             }else if(commands[i]==-1){//右转 90
    29                 dir=(dir+1)%4;//原来方向+1 %4  为现在方向
    30             }else{//照着现在 方向遍历,移动位置
    31                 int nextx=x,nexty=y;
    32                 for(int j=0;j<commands[i];j++){
    33                     nextx=x+dirx[dir];//下一个 方向 位置坐标
    34                     nexty=y+diry[dir];//这里的x,y,也要实时更新,
    35                     if(st.find({nextx,nexty})!=st.end()){//去查是否是障碍物
    36                         //是,跳出这一轮的移动
    37                         break;
    38                     }//否则,每次都计算,太耗时间了 
    39                        x=nextx;//没有找到障碍物,那么更新当前位置
    40                        y=nexty;
    41                 }//线段L上距离一点A最远的点必是L的端点 ,所以,遇到障碍物,跳出,之前那个点,就是最远的距离,
    42                 ans=max(ans,x*x+y*y);//同时计算 最大值
    43             }
    44         }
    45         return ans;
    46     }
    47 };
  • 相关阅读:
    编程思想
    为什么静态成员、静态方法中不能用this和super关键字
    C#中静态与非静态方法比较
    数组,集合,列表的使用与区别
    2017-3-23 网络IP
    [精彩] 关于DB2的内存分配
    DB2 常用命令
    SQL0973N在 "<堆名>" 堆中没有足够的存储器可用来处理语句
    DB2通用数据库性能调整的常用方法
    创建DB2数据库联合对象
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/11977497.html
Copyright © 2011-2022 走看看