874. 模拟行走机器人

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Discoverhfub/article/details/98676781

机器人在一个无限大小的网格上行走,从点 (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

class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
        
       vector<pair<int,int>> dire={{0,1},{1,0},{0,-1},{-1,0}};
       set<pair<int,int>> ob;
       int i=0,x=0,y=0,maxdis=0;
       for(vector<int> vi:obstacles){
           ob.insert(make_pair(vi[0],vi[1]));
       }
       for(int cd:commands){
           if(cd==-2){//左转
               i=(i+3)%4;
           }else if(cd==-1){//右转
               i=(i+1)%4;
           }else{//在某一个方向上对x或者对y更改
               while(cd){
                   int dx=x+dire[i].first;
                   int dy=y+dire[i].second;
                   if(ob.find(make_pair(dx,dy))==ob.end()){//没有障碍物则更新x和y
                      x=dx;
                      y=dy;
                     maxdis=max(maxdis,x*x+y*y);
                    }else{
                      break;
                   }
                   --cd;
               }
           }
       }
     
      return  maxdis;
    }
};

猜你喜欢

转载自blog.csdn.net/Discoverhfub/article/details/98676781