一. 题目描述
机器人在一个无限大小的网格上行走,从点 (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/