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# 中的EventHandler
    Leetcode:Combinations 组合
    Leetcode:Minimum Path Sum
    [LeetCode] Container With Most Water
    一个数n的最少可以由多少个数的平方和组成
    单链表的归并排序
    几个常用的操作系统进程调度算法(转)
    字符串的最长重复子串(转)
    linux静态链接库与动态链接库详解
    简易的hashtable实现
  • 原文地址:https://www.cnblogs.com/asenyang/p/9692927.html
Copyright © 2011-2022 走看看