5911. 模擬行走機器人 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” 。
示例 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"
提示:
- 2 <= width, height <= 100
- 1 <= num <= 10510^5105
- move ,getPos 和 getDir 總共 調用次數不超過 10410^4104 次。
解題思路
模擬機器人在外圈的移動,使用x,y維護機器人當前所在的位置,每次移動時判斷機器人是否會移出邊界,如果會出界,就改變移動方向
- 當移動步數超出外圈周長時,說明這次移動會超過一圈,所以我們可以將其對外圈周長取模,來獲取其實際移動的距離。如果取模的結果等于0的話,說明會跑回原點,但是可能存在特殊情況,就是起始位置的下一步就是邊界點的情況,跑完一圈以后方向可能會改變,因此我們需要對取模結果進行判斷,如果取模等于0,我們需要將結果置為外圈的長度。
代碼
class Robot {
public:int dir[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0 }};string name[4] = {"East", "North", "West", "South"};int x=0,y=0,idx=0,round;int row,col;Robot(int width, int height) {this->row=height;this->col=width;this->round=2*(height+width)-4;}bool is_valid(int x,int y){return x>=0&&x<row&&y>=0&&y<col;}void move(int num) {num%=round;if(num==0) num=round;for (int i = 0; i < num; ++i) {int nx=x+dir[idx][0],ny=y+dir[idx][1];if (!is_valid(nx,ny)){idx++;idx%=4;}x+=dir[idx][0],y+=dir[idx][1];}}vector<int> getPos() {return {y,x};}string getDir() {return name[idx];}
};/*** Your Robot object will be instantiated and called as such:* Robot* obj = new Robot(width, height);* obj->move(num);* vector<int> param_2 = obj->getPos();* string param_3 = obj->getDir();*/