📌  相关文章
📜  检查给定的移动序列是否在无限重复时是圆形的

📅  最后修改于: 2022-05-13 01:56:07.988000             🧑  作者: Mango

检查给定的移动序列是否在无限重复时是圆形的

给定一个字符串str表示一系列移动。任务是检查移动是否重复无限次,然后移动是否会被绑定在圆形路径中。运动可以是以下类型:

  • “G”:直走1个单位;
  • “L”:向左转90度;
  • “R”:向右转 90 度。

例子:

方法:在任何移动中,一个人可以面向“北”、“南”、“东”和“西”四个方向中的任何一个。这个想法是考虑最初站在(0, 0) 位置面向 North 。由于指令被无限次发出,如果在一些指令后返回起点,运动将导致循环路径。

这只有在一个指令后改变方向或返回原点时才有可能。

要在每条指令后计算出机器人的位置和方向,请根据方向从其位置添加或减去某些值。

这是每个方向的方向和运动的样子:

DirectionAddLR
North(0, 1)WestEast
West(-1, 0)SouthNorth
East(1, 0)NorthSouth
South(0, -1)EastWest

请按照以下步骤操作。

  • 向量的形式存储方向。由于初始位置在(0, 0) ,因此沿逆时针方向取方向以计算下一个位置。所以,向量是{N, W, S, E}
  • i 初始化为 0以跟踪旋转。这里,0 代表初始方向。如果在执行结束时为0,并且该位置不是起始位置,则该函数将返回false。
  • x 和 y 初始化为 0 ,因为它的初始位置是 (0, 0)。
  • 运行一个循环以逐个遍历指令。
  • 检查向右或向左旋转。将i向左旋转增加 1 ,向右旋转增加 3 。 (3 代表右转,因为右转 1 次等于左转 3 次,这里的方向被认为是逆时针方向)
  • 如果它是直的,则从对应于第 i方向的向量中添加x 和 y的值。
  • 结束循环。
  • 检查运动是否导致回到起始位置或方向不是起始方向。如果这两个条件中的任何一个为真,则返回真。否则,返回假。

下面是上述方法的实现。

C++
// C++ code to implement above approach
#include 
using namespace std;
 
// Function to check if the movements
// are repeated infinite times then
// it will be bounded in circular path or not
void isRobotBounded(string str)
{
    vector > dir
        = { { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } };
    int i = 0;
    int x = 0;
    int y = 0;
 
    for (int s = 0; s < str.size(); s++) {
        if (str.at(s) == 'L') {
            i = (i + 1) % 4;
        }
        else if (str.at(s) == 'R') {
            i = (i + 3) % 4;
        }
        else {
            x = x + dir[i][0];
            y = y + dir[i][1];
        }
    }
    if (x == 0 && y == 0 || i != 0)
        cout << "true";
    else
        cout << "false";
}
 
// Driver code
int main()
{
    string str = "GGLLGG";
 
    isRobotBounded(str);
    return 0;
}


Java
// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG {
 
  // Function to check if the movements
  // are repeated infinite times then
  // it will be bounded in circular path or not
  static void isRobotBounded(String str)
  {
    int[][] dir
      = { { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } };
    int i = 0;
    int x = 0;
    int y = 0;
 
    for (int s = 0; s < str.length(); s++) {
      if (str.charAt(s) == 'L') {
        i = (i + 1) % 4;
      }
      else if (str.charAt(s) == 'R') {
        i = (i + 3) % 4;
      }
      else {
        x = x + dir[i][0];
        y = y + dir[i][1];
      }
    }
    if (x == 0 && y == 0 || i != 0)
      System.out.println("true");
    else
      System.out.println("false");
  }
 
  // Driver code
  public static void main (String[] args) {
    String str = "GGLLGG";
 
    isRobotBounded(str);
 
  }
}
 
 
// This code is contributed by hrithikgarg03188.


Python3
# Python code for the above approach
 
# Function to check if the movements
# are repeated infinite times then
# it will be bounded in circular path or not
def isRobotBounded(str):
    dir = [[0, 1], [-1, 0], [0, -1], [1, 0]]
    i = 0
    x = 0
    y = 0
 
    for s in range(len(str)):
        if (str[s] == 'L'):
            i = (i + 1) % 4
        elif(str[s] == 'R'):
            i = (i + 3) % 4
        else:
            x = x + dir[i][0]
            y = y + dir[i][1]
    if (x == 0 and y == 0 or i != 0):
        print("true")
    else:
        print("false")
 
# Driver code
str = "GGLLGG"
isRobotBounded(str)
 
# This code is contributed by Saurabh Jaiswal


C#
// C# code to implement above approach
using System;
class GFG
{
 
  // Function to check if the movements
  // are repeated infinite times then
  // it will be bounded in circular path or not
  static void isRobotBounded(string str)
  {
    int [,]dir
      = { { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } };
    int i = 0;
    int x = 0;
    int y = 0;
 
    for (int s = 0; s < str.Length; s++) {
      if (str[s] == 'L') {
        i = (i + 1) % 4;
      }
      else if (str[s] == 'R') {
        i = (i + 3) % 4;
      }
      else {
        x = x + dir[i, 0];
        y = y + dir[i, 1];
      }
    }
    if (x == 0 && y == 0 || i != 0)
      Console.Write("true");
    else
      Console.Write("false");
  }
 
  // Driver code
  public static void Main()
  {
    string str = "GGLLGG";
 
    isRobotBounded(str);
  }
}
 
// This code is contributed by Samim Hossain Mondal.


Javascript



输出
true

时间复杂度: O(N) 其中 N 是字符串的长度
辅助空间: O(1)