方向数组 + 哈希判断 + 坐标行走模拟

class Solution {
    public int robotSim(int[] commands, int[][] obstacles) {
        int cl = commands.length,ol = obstacles.length; 
        int curx = 0,cury = 0;
        int dire = 0;
        int dirx[] = {0,1,0,-1}; //为啥是必须北东南西 这样子不然就错了???
        int diry[] = {1,0,-1,0};
        int ans = 0;
        Set> nbset = new HashSet<>(); //注意 Pair大小写
        for(int i = 0;i < ol;i++){  //用hash表存障碍点 以便及时判断是否到达障碍点
            nbset.add(new Pair<>(obstacles[i][0],obstacles[i][1]));
        }

        for(int i = 0; i < cl;i++){
            if(commands[i] == -1){ //此处为啥除余4??? 正常数字范围就是0~3 表示四个方向 等于四 就要归0!!!
                dire = (dire + 1) % 4;//表示向东走 
            }
            else if(commands[i] == -2){
                dire = (dire + 3) % 4;
            }
            else{ //此种条件就是向北走 但是要一步步走 每走一步就要判断是不是走到了障碍物上
                for(int j = 0; j < commands[i] ;j++){ //这个就是个记步数的 0|1开始都无所谓
                    int nx = curx + dirx[dire];
                    int ny = cury + diry[dire];
                    if(!nbset.contains(new Pair<>(nx,ny))){
                        curx = nx;//表示此处不包含障碍点 可以直接走 及时更新当前点
                        cury = ny;
                        ans = Math.max(ans,curx * curx + cury * cury);
                    }
                    else{//新的点到达了障碍点 则当前点不更新 直接进行下一条命令
                        break;
                    }
                }
            }
        }
        return ans;
    }
}
//为啥是必须北东南西 这样子不然就错了???
/*
基本思路:暴力法:遍历数组commands 
-2、-1左右转,更新的就是当前坐标横坐标,不过在左转后再前进就当前坐标横坐标减小;右转后前进 横坐标增大 我咋觉得对于左右的处理要dfs呢???
但是当是正数前进时就要考虑前进中 当前的位置 是否会与obsatcles重合 如果是就停下 直接执行下一条commands 
最后结果算一下当前坐标的平方和就好了
时间复杂度:遍历数组commands O(n),左右转没事 如果北走就要遍历大小 时间复杂度commands.length * cmmand[i]; 也就是mn

 */


 /*
 本题就是一个模拟:
 两个关键点:方向数组 + 哈希判断 + 过程模拟
 哈希判断就是语法  记住就好了
 但是这个方向数组 就有点难过了 为啥子方向数组就只能北东南西四个方向这样子循环 我在最终的方向上加上对应的数字不就好了吗?
 虽然记住就好了 但还是搞不懂咋回事???
  过程模拟:
  首先就是遍历每一个cmmands数组 倘若是变换方向就直接变  北走的话 就要逐步走 没得到一个新的坐标都要判断是否是障碍点 是的话就要跳到下一个命令 普通点就可以换成当前点 并且计算当前的欧式距离 完成最大值更新
  
  */

你可能感兴趣的:(算法笔记,深度优先,算法)