题目描述:
机器人在一个无限大小的网格上行走,从点 (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) 处
思路:
通过一个HashSet把障碍物存起来,把每次指令的步数拆成一步一步的走,在碰到障碍物之前结束这次命令。
而方向的控制由一个二维数组 direct表示 int[][] direct = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
分别存储上右下左四个方向。
上 右转90得到 右 右转90得到 下 右转90得到 左。。。依次类推
看代码:
public class Solution {
public static int robotSim(int[] commands, int[][] obstacles) {
int[][] direct = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
int max = 0;
int k = 0;
HashSet<String> set=new HashSet<>();
//将障碍物存在set里面
for (int i = 0; i < obstacles.length; i++) {
set.add(obstacles[i][0] + "," + obstacles[i][1]);
}
//机器人的当前位置
int p=0;
int q=0;
//获得每一个命令
for(int command:commands) {
if (command==-1) { // 右转
k = (k + 1) % 4;
}else if (command==-2) { //左转
k = (k + 4-1) % 4;
}else {
int cur[] =direct[k];
for (int i = 0; i < command; i++) { //command为多少就走多少步
if (set.contains((p + cur[0]) + "," + (q + cur[1]))) { //遇到了障碍物 则这次的命令终止
break;
}
//在当前方向上 每次走一步
p+=cur[0];
q+=cur[1];
}
max = Math.max(max, p * p + q * q);
}
}
return max;
}
public static void main(String[] args) {
robotSim(new int[]{4,-1,4,-2,4}, new int[][]{{2,4}});
}
}