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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 2069. 模拟行走机器人 II(模拟)

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

文章目錄

    • 1. 題目
    • 2. 解題

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); // 初始化網格圖,機器人在 (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 <= 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; // d 方向編號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) {//機器人只能沿著外圈走,一圈是多少步 2w+2h-4int circle = num/(2*xlimit+2*ylimit-4);num = num - (2*xlimit+2*ylimit-4)*circle;// 現在還剩余num步,位置還在 (x, y), 方向看是否在端點上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(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

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