日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5911. 模拟行走机器人 II

發布時間:2023/11/29 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5911. 模拟行走机器人 II 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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();*/

    總結

    以上是生活随笔為你收集整理的5911. 模拟行走机器人 II的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。