leetcode--874. 模拟行走机器人

一. 题目描述

机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令:

  • -2:向左转 90 度
  • -1:向右转 90 度
  • 1 <= x <= 9:向前移动 x 个单位长度

在网格上有一些格子被视为障碍物。

第 i 个障碍物位于网格点  (obstacles[i][0], obstacles[i][1])

如果机器人试图走到障碍物上方,那么它将停留在障碍物的前一个网格方块上,但仍然可以继续该路线的其余部分。

返回从原点到机器人的最大欧式距离的平方

示例 1:

输入: commands = [4,-1,3], obstacles = []
输出: 25
解释: 机器人将会到达 (3, 4)

示例 2:

输入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
输出: 65
解释: 机器人在左转走到 (1, 8) 之前将被困在 (1, 4) 处

二. 思路

这道题,被划分为贪心算法的范畴,其实我感觉跟贪心算法的关心真的不大,只是有个提前结束的条件,这就算是贪心算法,真的太过分了。

这道题的难点主要有两个,一个是方向的问题,一个是怎么处理机器人运动到障碍物上的情况。

另外,为了加快运行速度,需要将障碍物的信息放入Set中,如果使用数组或者列表,那么速度将会变得非常慢。

三. 代码

class Solution {
    public int distance(int[] index)
    {
        return index[0] * index[0] + index[1] * index[1];
    }
    public int robotSim(int[] commands, int[][] obstacles) {
        Set<String> obstacles_set = new HashSet<>();
        for( int i = 0; i < obstacles.length; i++ )
        {
            String point_str = obstacles[i][0] + "," + obstacles[i][1];
            obstacles_set.add(point_str);
        }
        
        int index[] = {0, 0};
        int direction_table[][] = {{0,1}, {1,0}, {0,-1}, {-1,0}}; // 0表示y正半轴,1表示x正半轴,2表示y负半轴,3表示x负半轴

        int direction_int = 0;
        int direction[] = direction_table[direction_int];
        
        int distance_max = 0;
        for( int command : commands )
        {
            if(command < 0)
            {
                if(command == -1)
                {
                    direction_int = (direction_int + 1) % 4;
                }
                else if(command == -2)
                {
                    direction_int = (direction_int - 1 + 4) % 4;
                }
                direction = direction_table[direction_int];
            }
            else
            {
                for( int dx = 0; dx < command; dx += 1)
                {
                    index[0] += direction[0];
                    index[1] += direction[1];
                    String index_str = index[0] + "," + index[1];
                    if( obstacles_set.contains(index_str) )
                    {
                        index[0] -= direction[0];
                        index[1] -= direction[1];
                        break;
                    }
                }
            }
            if( distance_max < distance(index) )
            {
                distance_max = distance(index);
            }
        }
        return distance_max;
    }
}

四. 引用

leetcode:https://leetcode-cn.com/problems/walking-robot-simulation/

猜你喜欢

转载自blog.csdn.net/qq_28634403/article/details/87359221