LeetCode 874. 模拟行走机器人(C++)

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

C++

class Solution {
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) 
    {
        int res=0;
        //北0,东1,南2,西3
        int n=commands.size();
        int flag=0;
        int x=0;
        int y=0;
        map<vector<int>,int> tmp;
        for(auto it:obstacles)
        {
            tmp[it]++;
        }
        for(int i=0;i<n;i++)
        {
            if(-1==commands[i])
            {
                flag=(flag+1)%4;
            }
            else if(-2==commands[i])
            {
                flag=(flag+3)%4;
            }
            else
            {
                if(0==flag)
                {
                    for(int k=1;k<=commands[i];k++)
                    {
                        if(0==tmp[vector<int>{x,y+1}])
                        {
                            res=max(res,x*x+(y+1)*(y+1));
                            ++y;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                else if(2==flag)
                {
                    for(int k=1;k<=commands[i];k++)
                    {
                        if(0==tmp[vector<int>{x,y-1}])
                        {
                            res=max(res,x*x+(y-1)*(y-1));
                            --y;
                        }
                        else
                        {
                            break;
                        }                       
                    }
                }
                else if(1==flag)
                {
                    for(int k=1;k<=commands[i];k++)
                    {
                        if(0==tmp[vector<int>{x+1,y}])
                        {
                            res=max(res,(x+1)*(x+1)+y*y);
                            ++x;
                        }
                        else
                        {
                            break;
                        }
                    }                
                }
                else
                {
                    for(int k=1;k<=commands[i];k++)
                    {
                        if(0==tmp[vector<int>{x-1,y}])
                        {
                            res=max(res,(x-1)*(x-1)+y*y);
                            --x;
                        }
                        else
                        {
                            break;
                        }
                    }                  
                }
            }          
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_27060423/article/details/89218601