检查路径序列是否访问任何坐标两次
在某些应用中,我们可能对检查路径序列是否访问任何坐标两次感兴趣。这很有用,例如,在 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++) { // 检查当前坐标是否已经被访问过 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() { // 测试用例 1 int path1[5][2] = {{0,0},{1,1},{2,2},{3,3},{4,4}}; if(isVisitedTwice(5, path1)) { cout << "序列访问一个坐标两次" << endl; } else { cout << "序列未访问一个坐标两次" << endl; } // 测试用例 2 int path2[6][2] = {{0,0},{1,1},{2,2},{3,3},{4,4},{3,3}}; if(isVisitedTwice(6, path2)) { cout << "序列访问一个坐标两次" << endl; } else { cout << "序列没有访问坐标两次" << endl; } // 测试用例 3 int path3[3][2] = {{0,0},{1,1},{2,2}}; if(isVisitedTwice(3, path3)) { cout << "序列访问坐标两次" << endl; } else { cout << "序列没有访问坐标两次" << endl; } return 0; }
输出
序列不会两次访问坐标 序列两次访问坐标 序列不会两次访问坐标
测试用例示例
考虑序列"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 实现