📌  相关文章
📜  检查是否可以从原点到达给定圆的圆周上的任何点

📅  最后修改于: 2021-04-17 17:08:45             🧑  作者: Mango

给定一个表示移动序列( LRUD )的字符串S和一个表示以圆心为原点(0,0)的圆的半径的整数R ,任务是检查是否有可能通过从字符串S中选择运动的任何子序列,可以从原点到达给定圆的圆周上的任何点。如果可以到达圆周上的某个点,则打印“是” 。否则,打印“否”
每个方向需要执行的操作如下:

  • 如果当前字符为L ,则将x坐标减1
  • 如果当前字符是R ,则将x坐标增加1
  • 如果当前字符是U ,则将y坐标增加1
  • 如果当前字符为D ,则将y坐标减1

例子:

天真的方法:最简单的方法是生成给定字符串S的所有可能的子序列,如果存在任何导致从原点(0,0)到达圆周的运动子序列,则打印“是” 。否则,打印“否”

时间复杂度: O(2 N )  
辅助空间: O(1)

高效的方法:可以根据以下观察结果对上述方法进行优化:

  • 由于需要考虑的路径是从原点(0,0)开始的,因此,如果字符串中每个字符LRUD中的最大计数值超过R ,则从原点到原点的路径圆的圆周存在。
  • 如果存在任意两个值xy,使得XY的平方和是R 2,则存在从原点到圆的圆周的三角形路径。

请按照以下步骤解决给定的问题:

  • 将给定字符串S中的字符LRUD的计数存储在变量cntLcntRcntUcntD中
  • 如果cntLcntRcntUcntD的最大值至少为R ,则存在一条从原点到圆周的直线路径。因此,打印“是”
  • 如果最大CNTLCNTR和最大cntUCNTD的的平方是至少R 2,然后打印“是”,因为存在从原点到圆的圆周的三角形路径。
  • 如果以上情况均不发生,则打印“否”

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to check if it is possible
// to reach any point on circumference
// of the given circle from (0,0)
string isPossible(string S, int R, int N)
{
    // Stores the count of 'L', 'R'
    int cntl = 0, cntr = 0;
 
    // Stores the count of 'U', 'D'
    int cntu = 0, cntd = 0;
 
    // Traverse the string S
    for (int i = 0; i < N; i++) {
        // Update the count of L
        if (S[i] == 'L')
            cntl++;
 
        // Update the count of R
        else if (S[i] == 'R')
            cntr++;
 
        // Update the count of U
        else if (S[i] == 'U')
            cntu++;
 
        // Update the count of D
        else
            cntd++;
    }
 
    // Condition 1 for reaching
    // the circumference
    if (max(max(cntl, cntr), max(cntu, cntd)) >= R)
        return "Yes";
 
    unordered_map mp;
 
    int r_square = R * R;
 
    for (int i = 1; i * i <= r_square; i++) {
 
        // Store the the value
        // of (i * i) in the Map
        mp[i * i] = i;
 
        // Check if (r_square - i*i)
        // already present in HashMap
        if (mp.find(r_square - i * i) != mp.end()) {
           
            // If it is possible to reach the
            // point (± mp[r_square - i*i], ± i)
            if (max(cntl, cntr)
                >= mp[r_square - i * i]
                && max(cntu, cntd) >= i)
 
                return "Yes";
 
            // If it is possible to reach the
            // point (±i, ±mp[r_square-i*i])
            if (max(cntl, cntr) >= i
                && max(cntu, cntd)
                >= mp[r_square - i * i])
 
                return "Yes";
        }
    }
 
    // If it is impossible to reach
    return "No";
}
 
// Driver Code
int main()
{
    string S = "RDLLDDLDU";
    int R = 5;
    int N = S.length();
   
    cout << isPossible(S, R, N);
 
    return 0;
}


Java
// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG{
 
// Function to check if it is possible
// to reach any point on circumference
// of the given circle from (0,0)
static String isPossible(String S, int R, int N)
{
     
    // Stores the count of 'L', 'R'
    int cntl = 0, cntr = 0;
 
    // Stores the count of 'U', 'D'
    int cntu = 0, cntd = 0;
 
    // Traverse the string S
    for(int i = 0; i < N; i++)
    {
         
        // Update the count of L
        if (S.charAt(i) == 'L')
            cntl++;
 
        // Update the count of R
        else if (S.charAt(i) == 'R')
            cntr++;
 
        // Update the count of U
        else if (S.charAt(i) == 'U')
            cntu++;
 
        // Update the count of D
        else
            cntd++;
    }
 
    // Condition 1 for reaching
    // the circumference
    if (Math.max(Math.max(cntl, cntr),
                 Math.max(cntu, cntd)) >= R)
        return "Yes";
 
    HashMap mp = new HashMap<>();
 
    int r_square = R * R;
 
    for(int i = 1; i * i <= r_square; i++)
    {
         
        // Store the the value
        // of (i * i) in the Map
        mp.put(i * i, i);
 
        // Check if (r_square - i*i)
        // already present in HashMap
        if (mp.containsKey(r_square - i * i))
        {
             
            // If it is possible to reach the
            // point (± mp[r_square - i*i], ± i)
            if (Math.max(cntl, cntr) >=
                mp.get(r_square - i * i) &&
                Math.max(cntu, cntd) >= i)
                return "Yes";
 
            // If it is possible to reach the
            // point (±i, ±mp[r_square-i*i])
            if (Math.max(cntl, cntr) >= i &&
                Math.max(cntu, cntd) >=
                mp.get(r_square - i * i))
                return "Yes";
        }
    }
 
    // If it is impossible to reach
    return "No";
}
 
// Driver Code
public static void main(String[] args)
{
    String S = "RDLLDDLDU";
    int R = 5;
    int N = S.length();
 
    System.out.println(isPossible(S, R, N));
}
}
 
// This code is contributed by Kingash


Python3
# Python3 program for the above approach
 
# Function to check if it is possible
# to reach any point on circumference
# of the given circle from (0,0)
def isPossible(S, R, N):
 
    # Stores the count of 'L', 'R'
    cntl = 0
    cntr = 0
 
    # Stores the count of 'U', 'D'
    cntu = 0
    cntd = 0
 
    # Traverse the string S
    for i in range(N):
         
        # Update the count of L
        if (S[i] == 'L'):
            cntl += 1
 
        # Update the count of R
        elif (S[i] == 'R'):
            cntr += 1
 
        # Update the count of U
        elif (S[i] == 'U'):
            cntu += 1
 
        # Update the count of D
        else:
            cntd += 1
 
    # Condition 1 for reaching
    # the circumference
    if (max(max(cntl, cntr), max(cntu, cntd)) >= R):
        return "Yes"
 
    mp = {}
 
    r_square = R * R
 
    i = 1
    while i * i <= r_square:
         
        # Store the the value
        # of (i * i) in the Map
        mp[i * i] = i
 
        # Check if (r_square - i*i)
        # already present in HashMap
        if ((r_square - i * i) in mp):
 
            # If it is possible to reach the
            # point (± mp[r_square - i*i], ± i)
            if (max(cntl, cntr) >= mp[r_square - i * i] and
               max(cntu, cntd) >= i):
 
                return "Yes"
 
            # If it is possible to reach the
            # point (±i, ±mp[r_square-i*i])
            if (max(cntl, cntr) >= i and
               max(cntu, cntd) >= mp[r_square - i * i]):
 
                return "Yes"
 
        i += 1
 
    # If it is impossible to reach
    return "No"
 
# Driver Code
if __name__ == "__main__":
 
    S = "RDLLDDLDU"
    R = 5
    N = len(S)
 
    print(isPossible(S, R, N))
 
# This code is contributed by ukasp


输出:
Yes

时间复杂度: O(N + R)
辅助空间: O(R 2 )