【力扣每日一题】2023.7.19 模拟行走机器人

题目:

示例:

分析:

机器人模拟类题目,力扣里有很多这样的模拟题,就是模拟机器人在坐标系上行走.

套路就是记下每个方向行走后,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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值