题目:
示例:
分析:
机器人模拟类题目,力扣里有很多这样的模拟题,就是模拟机器人在坐标系上行走.
套路就是记下每个方向行走后,x轴和y轴的变化(代码中的direction),例如 direction[0] 就表示向北走一次,y轴+1,x轴不变.然后左转则将指向direction的下标减一(若是小于0则变成3,direction[3]表示向西).右转则将指向direction的下标加一(若是大于3则变成0,direction[0]表示向北).
每次行走只需要将现在所在的坐标([i,j])加上direction即可.
本题添加了障碍,我们可以将障碍先存进set中,方便检测是否遇到障碍,然后再模拟过程中检查是否遇到障碍,若是遇到障碍则回退一格.
代码+运行结果:
class Solution {
public:
//方向: 北 东 南 西
vector<vector<int>>direction{{1,0},{0,1},{-1,0},{0,-1}};
int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
int res=0;
//将障碍存入set中方便检测.不用set,在检查的时候改成遍历obstacles也是可以的.
set<vector<int>>s;
for(const auto &obstacle:obstacles) s.insert(obstacle);
int flag=0;
int x=0,y=0;
for(const int &command:commands){
//如果遇到转向指令则将指向direction的下标改变
if(command==-1){
if(flag==3) flag=0;
else flag++;
continue;
}else if(command==-2){
if(flag==0) flag=3;
else flag--;
continue;
}else{
//开始行走
for(int i=0;i<command;i++){
x+=direction[flag][0],y+=direction[flag][1];
//如果遇到障碍,那么回退一格,并且接下来的步数也不用接着走,直接等待下一个指令
if(s.count({y,x})!=0){
x-=direction[flag][0],y-=direction[flag][1];
break;
}
}
}
//更新res
res=max(res,x*x+y*y);
}
return res;
}
};