列表

详情


2069. 模拟行走机器人 II

给你一个在 XY 平面上的 width x height 的网格图,左下角 的格子为 (0, 0) ,右上角 的格子为 (width - 1, height - 1) 。网格图中相邻格子为四个基本方向之一("North""East""South" 和 "West")。一个机器人 初始 在格子 (0, 0) ,方向为 "East" 。

机器人可以根据指令移动指定的 步数 。每一步,它可以执行以下操作。

  1. 沿着当前方向尝试 往前一步 。
  2. 如果机器人下一步将到达的格子 超出了边界 ,机器人会 逆时针 转 90 度,然后再尝试往前一步。

如果机器人完成了指令要求的移动步数,它将停止移动并等待下一个指令。

请你实现 Robot 类:

 

示例 1:

example-1

输入:
["Robot", "move", "move", "getPos", "getDir", "move", "move", "move", "getPos", "getDir"]
[[6, 3], [2], [2], [], [], [2], [1], [4], [], []]
输出:
[null, null, null, [4, 0], "East", null, null, null, [1, 2], "West"]

解释:
Robot robot = new Robot(6, 3); // 初始化网格图,机器人在 (0, 0) ,朝东。
robot.move(2);  // 机器人朝东移动 2 步,到达 (2, 0) ,并朝东。
robot.move(2);  // 机器人朝东移动 2 步,到达 (4, 0) ,并朝东。
robot.getPos(); // 返回 [4, 0]
robot.getDir(); // 返回 "East"
robot.move(2);  // 朝东移动 1 步到达 (5, 0) ,并朝东。
                // 下一步继续往东移动将出界,所以逆时针转变方向朝北。
                // 然后,往北移动 1 步到达 (5, 1) ,并朝北。
robot.move(1);  // 朝北移动 1 步到达 (5, 2) ,并朝  (不是朝西)。
robot.move(4);  // 下一步继续往北移动将出界,所以逆时针转变方向朝西。
                // 然后,移动 4 步到 (1, 2) ,并朝西。
robot.getPos(); // 返回 [1, 2]
robot.getDir(); // 返回 "West"

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Robot { public: Robot(int width, int height) { } void step(int num) { } vector<int> getPos() { } string getDir() { } }; /** * Your Robot object will be instantiated and called as such: * Robot* obj = new Robot(width, height); * obj->step(num); * vector<int> param_2 = obj->getPos(); * string param_3 = obj->getDir(); */

golang 解法, 执行用时: 144 ms, 内存消耗: 8.1 MB, 提交时间: 2023-09-04 23:35:16

type Robot struct{
}

var w, h, step int


func Constructor(width int, height int) Robot {
    w, h, step = width, height, 0
    return Robot{}
}


func (this *Robot) Step(num int)  {
	// 由于机器人只能走外圈,那么走 (w+h-2)*2 步后会回到起点
	// 同时,将 step 取模固定在 [1,(w+h-2)*2] 范围内,这样不需要特判处于原点时的方向
	step = (step+num-1)%((w+h-2)*2) + 1
}


func (this *Robot) GetPos() []int {
    x, y, _ := get(); 
    return []int{x, y}
}


func (this *Robot) GetDir() string {
    _, _, d := get()
    return d
}

func get() (x, y int, dir string) {
	switch {
	case step < w:
		return step, 0, "East"
	case step < w+h-1:
		return w - 1, step - w + 1, "North"
	case step < w*2+h-2:
		return w*2 + h - 3 - step, h - 1, "West"
	default:
		return 0, (w+h-2)*2 - step, "South"
	}
}



/**
 * Your Robot object will be instantiated and called as such:
 * obj := Constructor(width, height);
 * obj.Step(num);
 * param_2 := obj.GetPos();
 * param_3 := obj.GetDir();
 */

python3 解法, 执行用时: 220 ms, 内存消耗: 20.4 MB, 提交时间: 2023-09-04 23:28:20

class Robot:
    def __init__(self, width: int, height: int):
        self.w, self.h, self.s = width, height, 0

    def step(self, num: int) -> None:
        # 由于机器人只能走外圈,那么走 (w+h-2)*2 步后会回到起点
        # 同时,将 s 取模固定在 [1,(w+h-2)*2] 范围内,这样不需要特判处于原点时的方向
        self.s = (self.s + num - 1) % ((self.w + self.h - 2) * 2) + 1

    def get(self):
        s, w, h = self.s, self.w, self.h
        if s < w: return s, 0, "East"
        if s < w + h - 1: return w - 1, s - w + 1, "North"
        if s < w * 2 + h - 2: return w * 2 + h - 3 - s, h - 1, "West"
        return 0, (w + h - 2) * 2 - s, "South"

    def getPos(self) -> List[int]:
        x, y, _ = self.get()
        return [x, y]

    def getDir(self) -> str:
        return self.get()[2]



# Your Robot object will be instantiated and called as such:
# obj = Robot(width, height)
# obj.step(num)
# param_2 = obj.getPos()
# param_3 = obj.getDir()

上一题