874. 模拟行走机器人
题目描述
模拟机器人行走,默认向北,-1左转90度,-2右转90度,1-9表示前进。另有表示障碍的二维数组,遇到障碍往障碍后退一格。求经过的点到原点欧氏距离最大值。
思路
顺着题目描述暴力解。题目看清!是求最大值!但是超时了。
官方思路
机器人每试图走一个位置,就用此位置与障碍物集合列表里的坐标进行比较,看是否刚好是障碍物坐标点。
必须注意使用 集合 Set 作为对障碍物使用的数据结构,以便我们可以有效地检查下一步是否受阻。如果不这样做,我们检查 该点是障碍点吗 可能会慢大约 10000 倍。
PS:既然用3,2,1,0表示了东南西北,那就在移动的时候把它利用起来啊喂!还分什么情况讨论就!
代码
class Solution {
public:
int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
int dir=0;//方向,初始为北
int x=0,y=0;//当前位置
bool flag=1;//可以通行
int ans=0;
int direx[] = {0,-1,0,1};
int direy[] = {1,0,-1,0};
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<commands.size();i++){
if(commands[i]>=0){
flag=1;
for(int j=0;j<commands[i];j++){
int nx = x + direx[dir];
int ny = y + direy[dir];
if (obstacleSet.find(make_pair(nx, ny)) == obstacleSet.end()) {
x = nx;
y = ny;
ans = max(ans, x*x + y*y);
}else{
break;
}
}
}
else if(commands[i]==-2){
dir=(dir+1)%4;
}
else if(commands[i]==-1){
dir=(dir+3)%4;
}
}
return ans;
}
};
知识点
set——关联容器
- set以RBTree作为底层容器
- 所得元素的只有key没有value,value就是key
- 不允许出现键值重复
- 所有的元素都会被自动排序
- 不能通过迭代器来改变set的值,因为set的值就是键