机器人在一个无限大小的网格上行走,从点 (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]
==============================================================================================
主要考虑:①机器人的方向,会接受两个关于方向的命令:-1右转和-2左转;②以及在前进时会不会遇到障碍物,遇到障碍物就停在前一步,继续下一条指令;③从原点到机器人的最大欧式距离的平方,应该说在机器人行走的过程中,从原点到机器人的最大欧式距离的平方。也就是意味着每走一步我就要计算距离,最后返回最大的那个。代码如下:
public static void main(String[] args) {
int [] arr = {4,-1,3};
int [][] ob = {};
System.out.println(robotSim(arr,ob));
}
public static int robotSim(int[] commands,int[][] obstacles) {
int aimX = 0,aimY = 0; //定义机器人每走一步的坐标
int dir = 0; //定义方向,初始为0 (0,1,2,3分别代表北,东,南,西)
int max = 0; //定义机器人里原点的最大欧式距离的平方。
Map<String, Boolean> map = new HashMap<>();
/*
* 将障碍点的坐标存进map,key存坐标,value存boolean值,恒定为true(存其他的类型也可以)
*/
for(int i = 0;i < obstacles.length;i++){
map.put(obstacles[i][0]+","+obstacles[i][1],true);
}
/*
* 遍历commands,判断机器人接收到的命令
*/
for(int i = 0;i < commands.length;i++){
if(commands[i] == -1){ //命令为-1,动作为向右转,也就是面向了东
dir = (dir + 1)%4;
}else if(commands[i] == -2){ //命令为-2,动作为向左转,相当于向右转3次,也就是面向了西
dir = (dir + 3)%4;
}else{ //其他的命令就都是前进,前进首先要确定方向
switch(dir){
case 0: //0代表面向北,向北前进X的值不变,Y值增加
for(int j = 0;j < commands[i];j++){ //使机器人一步一步走,每走一步加1
aimX = aimX;
aimY++;
if(map.containsKey(aimX+","+aimY)){ //如果下一步有障碍点存在,就退回上一步
aimY--;
break;
}
/*
* 每走一步都计算与原点的最大欧式距离的平方。
* 并与上一步进行比较,取最大值。
*/
max = Math.max(max,aimX*aimX+aimY*aimY);
}
break;
case 1: //1代表向东,向东前进,Y值不变,X增加
for(int j = 0;j < commands[i];j++){
aimX ++;
aimY = aimY;
if(map.containsKey(aimX+","+aimY)){
aimX--;
break;
}
max = Math.max(max,aimX*aimX+aimY*aimY);
}
break;
case 2: //2代表向南,向南前进,Y值减小,X不变
for(int j = 0;j < commands[i];j++){
aimX = aimX;
aimY--;
if(map.containsKey(aimX+","+aimY)){
aimY++;
break;
}
max = Math.max(max,aimX*aimX+aimY*aimY);
}
break;
case 3: //3代表向西,向西前进,Y值不变,X减小
for(int j = 0;j < commands[i];j++){
aimX--;
aimY = aimY;
if(map.containsKey(aimX+","+aimY)){
aimX++;
break;
}
max = Math.max(max,aimX*aimX+aimY*aimY);
}
break;
}
}
}
return max;
}