当前位置: 代码迷 >> 综合 >> LeetCode第874题解析
  详细解决方案

LeetCode第874题解析

热度:98   发布时间:2024-02-09 19:37:01.0

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

提示:

  1. 0 <= commands.length <= 10000
  2. 0 <= obstacles.length <= 10000
  3. -30000 <= obstacle[i][0] <= 30000
  4. -30000 <= obstacle[i][1] <= 30000
  5. 答案保证小于 2 ^ 31
class Solution {
public:int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {//方向向量int direx[] = {0, 1, 0, -1};int direy[] = {1, 0, -1, 0};//记录机器人的现在坐标int curx = 0, cury = 0;//记录现在的方向int curdire = 0;int comLen = commands.size();//保存结果int ans = 0;//用set记录障碍物的位置set<pair<int,int>> obstacleSet;for(int i = 0; i < obstacles.size(); ++i) {obstacleSet.insert(make_pair(obstacles[i][0], obstacles[i][1]));}for(int i = 0; i < comLen; ++i) {//如果是-2,向左转90度,取模是为了防止超出数组下标if(commands[i] == -2) {curdire = (curdire + 3) % 4;}//如果是-1,向右转90度else if(commands[i] == -1) {curdire = (curdire + 1) % 4;}else {for(int j = 0; j < commands[i]; ++j) {//机器人尝试向前走一步,并判断是否会遇到障碍物int nx = curx + direx[curdire];int ny = cury + direy[curdire];if(obstacleSet.find(make_pair(nx, ny)) == obstacleSet.end()) {curx = nx;cury = ny;ans = max(ans, curx * curx + cury * cury);}else {break;}}}}return ans;}
};