首页 >后端开发 >C++ >检查一个路径序列是否访问了任何坐标两次或更多次

检查一个路径序列是否访问了任何坐标两次或更多次

WBOY
WBOY转载
2023-08-25 19:05:10962浏览

检查一个路径序列是否访问了任何坐标两次或更多次

在某些应用程序中,我们可能有兴趣检查路径序列是否访问任何坐标两次。例如,这在 GPS 跟踪系统中非常有用,可以检测车辆是否在两点之间来回移动。在本文中,我们将讨论如何检查路径序列是否访问任意坐标两次,及其在 C++ 中的实现。

算法

为了解决这个问题,我们可以使用哈希表来跟踪迄今为止访问过的所有坐标。我们首先访问序列中的第一个坐标,并将其添加到哈希表中。然后,对于序列中的每个后续坐标,我们检查它是否已经在哈希表中。如果是,我们就知道我们之前访问过这个坐标,我们可以返回 true。如果不是,我们将其添加到哈希表中并继续下一个坐标。如果我们访问了所有坐标而没有找到任何重复项,我们可以返回 false。

示例

这是上述算法在 C++ 中的实现−

#include<bits/stdc++.h>
using namespace std;

bool isVisitedTwice(int n, int path[][2]) {
   set<pair<int, int>> visited;
   for(int i=0;i<n;i++) {
      // Check if the current coordinate has already been visited
      if(visited.find(make_pair(path[i][0], path[i][1])) != visited.end()) {
         return true;
      }
      visited.insert(make_pair(path[i][0], path[i][1]));
   }
   return false;
}

int main() {

   // Test case 1
   int path1[5][2] = {{0,0},{1,1},{2,2},{3,3},{4,4}};
   if(isVisitedTwice(5, path1)) {
      cout << "Sequence visits a coordinate twice" << endl;
   } else {
      cout << "Sequence does not visit a coordinate twice" << endl;
   }
   
   // Test case 2
   int path2[6][2] = {{0,0},{1,1},{2,2},{3,3},{4,4},{3,3}};
   if(isVisitedTwice(6, path2)) {
      cout << "Sequence visits a coordinate twice" << endl;
   } else {
      cout << "Sequence does not visit a coordinate twice" << endl;
   }
   
   // Test case 3
   int path3[3][2] = {{0,0},{1,1},{2,2}};
   if(isVisitedTwice(3, path3)) {
      cout << "Sequence visits a coordinate twice" << endl;
   } else {
      cout << "Sequence does not visit a coordinate twice" << endl;
   }

   return 0;
}

输出

Sequence does not visit a coordinate twice
Sequence visits a coordinate twice
Sequence does not visit a coordinate twice

测试用例示例

考虑代表路径“上、下、下、左、左、右、上、上、下、上”的序列“UDDLLRUUUDU”。

我们从原点 (0, 0) 开始,遍历路径,沿途更新坐标。

在每一步中,我们都会检查之前是否已经访问过新坐标。如果是,我们知道该序列访问了一个坐标两次,我们返回 true。如果没有,我们将坐标标记为已访问并继续。

以下是算法如何针对给定序列工作的 -

  • 从原点 (0, 0) 开始

  • “U”  向上移动到 (0, 1)。将 (0, 1) 标记为已访问。

  • “D”  向下移动到 (0, 0)。将 (0, 0) 标记为已访问。

  • “D” 向下移动到 (0, -1)。将 (0, -1) 标记为已访问。

  • “L”  向左移动到 (-1, -1)。将 (-1, -1) 标记为已访问。

  • “L”  向左移动到 (-2, -1)。将 (-2, -1) 标记为已访问。

  • “R”  右移至 (-1, -1)。这个坐标之前已经被访问过,所以我们返回true。

由于序列访问坐标两次,因此函数返回 true。

因此,对于给定的序列“UDDLLRUUUDU”,该函数正确返回该序列访问坐标两次。

结论

在本文中,我们讨论了如何检查路径序列是否访问任何坐标两次。我们使用哈希表来跟踪迄今为止访问过的所有坐标,并在每一步检查重复项。我们还提供了该算法的 C 实现

以上是检查一个路径序列是否访问了任何坐标两次或更多次的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:tutorialspoint.com。如有侵权,请联系admin@php.cn删除