zoukankan      html  css  js  c++  java
  • leetcode874

    这道题直接按照题意来解,建立坐标系和移动方案,思路是比较简单的。只是需要注意需要使用set来判断是否遇到障碍,否则会超时。

    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
    
        int N = commands.size();
        int M = obstacles.size();
    
        //向上 Wx=0,Wy=1
        //向左 Wx=-1,Wy=0
        //向下 Wx=0,Wy=-1
        //向右 Wx=1,Wy=0
    
        set<pair<int, int>> st;
        for (auto &obs : obstacles)
        {
            st.insert(make_pair(obs[0], obs[1]));
        }
    
        int Wx = 0;
        int Wy = 1;
    
        int Px = 0;
        int Py = 0;
        int maxdistance = 0;
    
        for (int i = 0; i < N; i++)
        {
            int cmd = commands[i];//当前指令        
            if (cmd == -2)//左转
            {
                if (Wx == 0 && Wy == 1)//上-->左
                {
                    Wx = -1;
                    Wy = 0;
                }
                else if (Wx == -1 && Wy == 0)//左-->下
                {
                    Wx = 0;
                    Wy = -1;
                }
                else if (Wx == 0 && Wy == -1)//下-->右
                {
                    Wx = 1;
                    Wy = 0;
                }
                else if (Wx == 1 && Wy == 0)//右-->上
                {
                    Wx = 0;
                    Wy = 1;
                }
            }
            else if (cmd == -1)//右转
            {
                if (Wx == 0 && Wy == 1)//上-->右
                {
                    Wx = 1;
                    Wy = 0;
                }
                else if (Wx == -1 && Wy == 0)//左-->上
                {
                    Wx = 0;
                    Wy = 1;
                }
                else if (Wx == 0 && Wy == -1)//下-->左
                {
                    Wx = -1;
                    Wy = 0;
                }
                else if (Wx == 1 && Wy == 0)//右-->下
                {
                    Wx = 0;
                    Wy = -1;
                }
            }
            else//移动 1<=x<=9
            {
                //此次移动之前的起点位置为Px和Py
                int Tmpx = Px;
                int Tmpy = Py;
                while (cmd > 0)
                {
                    //以(Wx,Wy)为步进,移动一次
                    Tmpx += Wx;
                    Tmpy += Wy;
    
                    if (st.find(make_pair(Tmpx, Tmpy)) != st.end())
                    {
                        Tmpx -= Wx;
                        Tmpy -= Wy;
                        cmd = 0;
                    }
                    cmd--;
                }
                int distance = Tmpx*Tmpx + Tmpy*Tmpy;
                if (maxdistance < distance)
                {
                    maxdistance = distance;
                }
                Px = Tmpx;
                Py = Tmpy;
            }
        }
    
        return maxdistance;
    }
  • 相关阅读:
    C#的委托事件总结
    iOS的录屏功能
    Unity通过NTP获取网络时间
    Unity的弱联网Json数据传输
    Unity场景和代码合并以及UnityYAMLMerge的使用
    Unity学习--捕鱼达人笔记
    Yomob广告在cocos2dx安卓平台的Demo
    谷歌广告Admob在cocos2dx上通过回调实现底部Banner
    JZ2440 裸机驱动 第13章 LCD控制器(2)
    JZ2440 裸机驱动 第13章 LCD控制器(1)
  • 原文地址:https://www.cnblogs.com/asenyang/p/9692927.html
Copyright © 2011-2022 走看看