生活随笔
收集整理的這篇文章主要介紹了
LeetCode 2069. 模拟行走机器人 II(模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1. 題目
給你一個在 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);
robot
.move(2);
robot
.move(2);
robot
.getPos();
robot
.getDir();
robot
.move(2);
robot
.move(1);
robot
.move(4);
robot
.getPos();
robot
.getDir(); 提示:
2 <= width
, height
<= 100
1 <= num
<= 10^5
move ,getPos 和 getDir 總共 調用次數不超過
10^4 次。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/walking-robot-simulation-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 只能在最外圈行走,先看能走幾個完整的圈,只需要模擬剩余的不能構成整圈的步數
- 初始方向根據是否在四個頂點確定
class Robot {vector
<string
> dirname
= {"East", "North", "West", "South"};vector
<vector
<int>> dir
= {{1,0},{0,1},{-1,0},{0,-1}};vector
<vector
<int>> endpoint
;int x
= 0, y
= 0, d
= 0; int xlimit
, ylimit
;
public:Robot(int width
, int height
) {xlimit
= width
;ylimit
= height
;endpoint
.resize(4);endpoint
[0] = {width
-1, 0};endpoint
[1] = {width
-1, height
-1};endpoint
[2] = {0, height
-1};endpoint
[3] = {0, 0};}void move(int num
) {int circle
= num
/(2*xlimit
+2*ylimit
-4);num
= num
- (2*xlimit
+2*ylimit
-4)*circle
;for(int i
= 0; i
< 4; ++i
){if(x
==endpoint
[i
][0] && y
==endpoint
[i
][1]){d
= i
;break;}}while(num
){if(inEnd(x
, y
))d
= (d
+1)%4;if(num
>= abs(endpoint
[d
][0]-x
)+abs(endpoint
[d
][1]-y
)){ num
-= abs(endpoint
[d
][0]-x
)+abs(endpoint
[d
][1]-y
);x
= endpoint
[d
][0];y
= endpoint
[d
][1];}else {x
+= dir
[d
][0]*num
;y
+= dir
[d
][1]*num
;num
= 0;}}}vector
<int> getPos() {return {x
, y
};}string
getDir() {return dirname
[d
];}bool inEnd(int a
, int b
){return (a
==0&&b
==0) || (a
==0&&b
==ylimit
-1) || (a
==xlimit
-1&&b
==0) || (a
==xlimit
-1&&b
==ylimit
-1);}
};
200 ms 117.7 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 2069. 模拟行走机器人 II(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。