1、描述
链接
机器人在一个二维平面上行走,二维平面有障碍物,以坐标形式给出。机器人可以左转和右转,前行3种状态。求给定机器人行动动作数组,完成过程中的最大欧氏距离?
2、关键字
二维数组
3、思路
贪心?每次一个动作完成之后,进行最大值更新
使用map和set进行障碍物的初始化!根据map中的第一个横坐标,把该横坐标对应的所有纵坐标上有障碍物的,进行构造map映射,
参照题解
模拟这个机器人的构造过程!
3.1 如果是3个方向
如果再加一个后转,也就是直接(dir+2)%4而已!!!
4、notes
转向,东西南北,使用0-1-2-3四个数字表示,然后进行取余操作,即可根据题目中的左转右转,更新东西南北的方向!
5、复杂度
时间O(M+N)机器人动作数组和障碍物数组的长度
空间:O(N)障碍物数组的长度
6、code
# define bei 0
# define nan 2
# define xii 3
# define don 1
int x,y,dir,mx;
class Solution {
// 当前的方向,基础,然后考虑后边的方向,写很多if eles? 还要考虑回退,遇到障碍
// 贪心在哪?
public:
int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
unordered_map<int,set<int>>obs;
for(auto & m:obstacles){
obs[m[0]].insert(m[1]);
}
x=y=mx=0;
dir=bei;
for(auto &cmd:commands){
if(cmd>0){
if(dir==bei) while(cmd && obs[x].count(y+1)==0) { --cmd ; ++y;}
if(dir==xii) while(cmd && obs[x-1].count(y)==0) { --cmd ; --x;}
if(dir==don) while(cmd && !obs[x+1].count(y) ) { --cmd ; ++x;}
if(dir==nan) while(cmd && !obs[x].count(y-1) ) --cmd , --y;
mx=max(mx,x*x+y*y);
}
if(cmd==-2) dir=(dir+3)%4;
if(cmd==-1) dir=(dir+1)%4;
//mx=max(mx,x*x+y*y); // 位置不对
}
return mx;
}
};