题目描述:

机器人在一个无限大小的网格上行走,从点 (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}});
	}

}