2069. Walking Robot Simulation Ii

2069. Walking Robot Simulation ii #

题目 #

  • 给你一个在 XY 平面上的 width x height 的网格图,左下角 的格子为 (0, 0)右上角 的格子为 (width - 1, height - 1) 。网格图中相邻格子为四个基本方向之一("North""East""South""West")。一个机器人 初始 在格子 (0, 0) ,方向为 "East"
  • 机器人可以根据指令移动指定的 步数 。每一步,它可以执行以下操作。
    1. 沿着当前方向尝试 往前一步
    2. 如果机器人下一步将到达的格子 超出了边界 ,机器人会 逆时针 转 90 度,然后再尝试往前一步。
  • 如果机器人完成了指令要求的移动步数,它将停止移动并等待下一个指令。
  • 请你实现 Robot 类:
    • Robot(int width, int height) 初始化一个 width x height 的网格图,机器人初始在 (0, 0) ,方向朝 "East"
    • void move(int num) 给机器人下达前进 num 步的指令。
    • int[] getPos() 返回机器人当前所处的格子位置,用一个长度为 2 的数组 [x, y] 表示。
    • String getDir() 返回当前机器人的朝向,为 "North""East""South" 或者 "West"

思路 #

模拟 #

代码 #

模拟 #

class Robot {
    private int maxWidth, maxHeight, curWidth, curHeight;
    private String dir;

    public Robot(int width, int height) {
        this.maxWidth = width;
        this.maxHeight = height;

        this.curWidth = 0;
        this.curHeight = 0;

        this.dir = "East";
    }
    
    public void step(int num) {
        num = num % (2 * (this.maxHeight-1 + this.maxWidth-1));
        if (num == 0) {
            if (this.curWidth == 0 && this.curHeight == 0) this.dir = "South";
            if (this.curWidth == this.maxWidth-1 && this.curHeight == 0) this.dir = "East";
            if (this.curWidth == this.maxWidth-1 && this.curHeight == this.maxHeight-1) this.dir = "North";
            if (this.curWidth == 0 && this.curHeight == this.maxHeight-1) this.dir = "West";
        }
        else {
            int numSteps = 0;
            while (num > 0) {
                switch (this.dir) {
                    case "East":
                        if (this.curWidth == this.maxWidth-1 && this.curHeight == 0) {
                            this.dir = "North";
                            numSteps = 0;
                        }
                        else {
                            numSteps = Math.min(num, this.maxWidth-1-this.curWidth);
                            this.curWidth += numSteps;
                        }
                        break;
                    case "North":
                        if (this.curHeight == this.maxHeight-1 && this.curWidth == this.maxWidth-1) {
                            this.dir = "West";
                            numSteps = 0;
                        }
                        else {
                            numSteps = Math.min(num, this.maxHeight-1-this.curHeight);
                            this.curHeight += numSteps;
                        }
                        break;
                    case "West":
                        if (this.curWidth == 0 && this.curHeight == this.maxHeight - 1) {
                            this.dir = "South";
                            numSteps = 0;
                        }
                        else {
                            numSteps = Math.min(num, this.curWidth);
                            this.curWidth -= numSteps;
                        }
                        break;
                    case "South":
                        if (this.curHeight == 0 && this.curWidth == 0) {
                            this.dir = "East";
                            numSteps = 0;
                        }
                        else {
                            numSteps = Math.min(num, this.curHeight);
                            this.curHeight -= numSteps;
                        }
                        break;
                }
                num -= numSteps;
            }
        }
    }
    
    public int[] getPos() {
        return new int[]{this.curWidth, this.curHeight};
    }
    
    public String getDir() {
        return this.dir;
    }
}

/**
 * Your Robot object will be instantiated and called as such:
 * Robot obj = new Robot(width, height);
 * obj.step(num);
 * int[] param_2 = obj.getPos();
 * String param_3 = obj.getDir();
 */

致谢 #

宫水三叶