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]

==============================================================================================

主要考虑:①机器人的方向,会接受两个关于方向的命令:-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;
	    }

猜你喜欢

转载自blog.csdn.net/DJGXGG/article/details/88184801