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 };
原文地址:https://www.cnblogs.com/NirobertEinteson/p/11977497.html