• 【Leetcode】2069. Walking Robot Simulation II


    题目地址:

    https://leetcode.com/problems/walking-robot-simulation-ii/description/

    给定一个 w × h w\times h w×h的二维矩阵,一个机器人位于左下角 ( 0 , 0 ) (0,0) (0,0)的位置,右上角的位置是 ( w − 1 , h − 1 ) (w-1, h-1) (w1,h1)。这个机器人一开始方向向东,要求实现下面的操作:
    1、以 w , h w,h w,h初始化;
    2、移动机器人 x x x步,机器人除非走到边界之外,否则方向不变;如果走到边界之外,则走到边界的时候需要逆时针转向 90 ° 90\degree 90°然后走剩余的步数;
    3、返回机器人位置;
    4、返回机器人朝向。

    首先,机器人无论在哪儿,其走 x x x步等价于走 x m o d    [ ( w + h − 2 ) ∗ 2 ] x\mod [(w+h-2)*2] xmod[(w+h2)2]步,所以可以先让 x x x取模,取模完毕之后剩余步数暴力模拟即可。需要注意一个特殊情况,如果机器人从未走过,其朝向是东,但是一旦其走过,在其回到 ( 0 , 0 ) (0,0) (0,0)的时候,朝向是南。其余的情况都可以直接模拟。代码如下:

    class Robot {
     public:
      int X, Y, dir;
      string direction[4] = {"East", "North", "West", "South"};
      int x, y;
      int dx[4] = {1, 0, -1, 0};
      int dy[4] = {0, 1, 0, -1};
      bool moved = false;
    
      Robot(int width, int height) {
        X = width;
        Y = height;
        x = y = dir = 0;
      }
    
      void step(int num) {
        moved = true;
        num %= (X - 1 + Y - 1) * 2;
        while (num) {
          int nx = x + dx[dir] * num, ny = y + dy[dir] * num;
          if (nx < 0 || nx >= X || ny < 0 || ny >= Y) {
            // 出界了,要转向
            dir = (dir + 1) % 4;
            if (nx < 0) num -= x, x = 0;
            else if (nx >= X) num -= X - 1 - x, x = X - 1;
            else if (ny < 0) num -= y, y = 0;
            else num -= Y - 1 - y, y = Y - 1;
          } else {
            // 没出界,则(nx, ny)即为新位置
            x = nx, y = ny;
            return;
          }
        }
      }
    
      vector<int> getPos() { return {x, y}; }
    
      string getDir() {
        // 如果走过,回到了原点,方向是南
        if (moved && !x && !y) return direction[3];
        return direction[dir];
      }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    所有操作时间复杂度 O ( 1 ) O(1) O(1),空间 O ( 1 ) O(1) O(1)

  • 相关阅读:
    【算法训练-二分查找 四】【模拟二分】X的平方根
    刷题笔记day27-回溯算法1
    Webmin -- Webmin Users
    3D数学之三角公式
    基于javaweb的oa办公管理系统(java+layui+ssm+mysql+jsp+html)
    leetcode 47. 全排列 II(java)
    智能优化算法Matlab源码大礼包领取
    Linux C++ 051-设计模式之中介者模式
    大学生简单静态HTML网页模板源码——家乡介绍美丽乡村11页
    Linux系统编程:编译过程以及GDB调试
  • 原文地址:https://blog.csdn.net/qq_46105170/article/details/128146797