2069. Walking Robot Simulation ii #
题目 #
- 给你一个在 XY 平面上的
width x height
的网格图,左下角 的格子为(0, 0)
,右上角 的格子为(width - 1, height - 1)
。网格图中相邻格子为四个基本方向之一("North"
,"East"
,"South"
和"West"
)。一个机器人 初始 在格子(0, 0)
,方向为"East"
。 - 机器人可以根据指令移动指定的 步数 。每一步,它可以执行以下操作。
- 沿着当前方向尝试 往前一步 。
- 如果机器人下一步将到达的格子 超出了边界 ,机器人会 逆时针 转 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();
*/