📜  给定路径的最小停靠点数

📅  最后修改于: 2021-10-27 08:34:27             🧑  作者: Mango

二维空间中有很多点需要按照特定的顺序访问。从一个点到另一个点的路径总是被选为最短路径,并且路径段总是与网格线对齐。现在我们得到了为访问点而选择的路径,我们需要告诉生成给定路径所需的最小点数。
例子:

在上图中,我们可以看到必须至少有 3 个点才能到达路径上方,分别用 A、B 和 C 表示

我们可以通过在访问止损时观察运动模式来解决这个问题。如果我们想要从一个点到另一个点的最短路径,那么我们将在一个或最多两个方向上移动,即总是有可能沿着最多两个方向到达另一点,如果使用两个以上的方向,则该路径不会是最短的,例如,路径 LLURD 只能用 LLL 替换,因此为了找到路径中的最小停靠点数,我们将遍历路径的字符并维护到目前为止所采取的方向图。如果在任何索引处我们发现“L”和“R”,或者我们发现“U”和“D”,那么必须在当前索引处停止,因此我们将停止计数增加一,然后我们将清除下一段的地图。

解决方案的总时间复杂度为 O(N)

// C++ program to find minimum number of points 
// in a given path
#include 
using namespace std;
  
// method returns minimum number of points in given path
int numberOfPointInPath(string path)
{
    int N = path.length();
  
    // Map to store last occurrence of direction
    map dirMap;
  
    // variable to store count of points till now, 
    // initializing from 1 to count first point
    int points = 1;
  
    // looping over all characters of path string
    for (int i = 0; i < N; i++) {
  
        // storing current direction in curDir 
        // variable
        char curDir = path[i];
  
        // marking current direction as visited
        dirMap[curDir] = 1;
  
        // if at current index, we found both 'L'
        // and 'R' or 'U' and 'D' then current 
        // index must be a point
        if ((dirMap['L'] && dirMap['R']) || 
            (dirMap['U'] && dirMap['D'])) {
              
            // clearing the map for next segment
            dirMap.clear();
  
            // increasing point count
            points++;
  
            // revisitng current direction for next segment
            dirMap[curDir] = 1;
        }
    }
  
    // +1 to count the last point also
    return (points + 1);
}
  
// Driver code to test above methods
int main()
{
    string path = "LLUUULLDD";
    cout << numberOfPointInPath(path) << endl;
    return 0; 
}

输出:

3

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程