Check if a sequence of path visits any coordinate twice or not


In certain applications, we might be interested in checking whether a sequence of path visits any coordinate twice or not. This can be useful, for example, in GPS tracking systems to detect if a vehicle is going back and forth between two points. In this article, we will discuss how to check if a sequence of path visits any coordinate twice or not, along with its implementation in C++.

Algorithm

To solve this problem, we can use a hash table to keep track of all the coordinates that we have visited so far. We start by visiting the first coordinate in the sequence, and add it to the hash table. Then, for each subsequent coordinate in the sequence, we check if it is already in the hash table. If it is, we know that we have visited this coordinate before and we can return true. If it is not, we add it to the hash table and continue to the next coordinate. If we have visited all coordinates without finding any duplicates, we can return false.

Example

Following are the programs to the above Algorithm −

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

bool isVisitedTwice(int n, int path[][2]) {
   int **visited = (int **)malloc(n * sizeof(int *));
   for (int i = 0; i < n; i++) {
      visited[i] = (int *)malloc(2 * sizeof(int));
      for (int j = 0; j < 2; j++) {
         visited[i][j] = 0;
      }
   }

   for (int i = 0; i < n; i++) {
      if (visited[path[i][0]][path[i][1]] == 1) {
         // Free dynamically allocated memory before returning.
         for (int j = 0; j < n; j++) {
            free(visited[j]);
         }
         free(visited);
         return true;
      }
      visited[path[i][0]][path[i][1]] = 1;
   }

   // Free dynamically allocated memory before returning.
   for (int j = 0; j < n; j++) {
      free(visited[j]);
   }
   free(visited);
   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)) {
      printf("Sequence visits a coordinate twice\n");
   } else {
      printf("Sequence does not visit a coordinate twice\n");
   }

   // Test case 2
   int path2[6][2] = {{0, 0}, {1, 1}, {2, 2}, {3, 3}, {4, 4}, {3, 3}};
   if (isVisitedTwice(6, path2)) {
      printf("Sequence visits a coordinate twice\n");
   } else {
      printf("Sequence does not visit a coordinate twice\n");
   }

   // Test case 3
   int path3[3][2] = {{0, 0}, {1, 1}, {2, 2}};
   if (isVisitedTwice(3, path3)) {
      printf("Sequence visits a coordinate twice\n");
   } else {
      printf("Sequence does not visit a coordinate twice\n");
   }

   return 0;
}

Output

Sequence does not visit a coordinate twice
Sequence visits a coordinate twice
Sequence does not visit a coordinate twice
#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;
}

Output

Sequence does not visit a coordinate twice
Sequence visits a coordinate twice
Sequence does not visit a coordinate twice
import java.util.HashSet;

public class VisitedTwice {
   static boolean isVisitedTwice(int n, int[][] path) {
      HashSet<String> visited = new HashSet<>();
      for (int i = 0; i < n; i++) {
         // Check if the current coordinate has already been visited
         String coordinate = path[i][0] + "," + path[i][1];
         if (visited.contains(coordinate)) {
            return true;
         }
         visited.add(coordinate);
      }
      return false;
   }

   public static void main(String[] args) {
      // Test case 1
      int[][] path1 = {{0,0},{1,1},{2,2},{3,3},{4,4}};
      if (isVisitedTwice(5, path1)) {
         System.out.println("Sequence visits a coordinate twice");
      } else {
         System.out.println("Sequence does not visit a coordinate twice");
      }
      
      // Test case 2
      int[][] path2 = {{0,0},{1,1},{2,2},{3,3},{4,4},{3,3}};
      if (isVisitedTwice(6, path2)) {
         System.out.println("Sequence visits a coordinate twice");
      } else {
         System.out.println("Sequence does not visit a coordinate twice");
      }

      // Test case 3
      int[][] path3 = {{0,0},{1,1},{2,2}};
      if (isVisitedTwice(3, path3)) {
         System.out.println("Sequence visits a coordinate twice");
      } else {
         System.out.println("Sequence does not visit a coordinate twice");
      }
   }
}

Output

Sequence does not visit a coordinate twice
Sequence visits a coordinate twice
Sequence does not visit a coordinate twice
def is_visited_twice(n, path):
   visited = set()
   for i in range(n):
      if tuple(path[i]) in visited:
         return True
      visited.add(tuple(path[i]))
   return False
# Test case 1
path1 = [[0,0],[1,1],[2,2],[3,3],[4,4]]
if is_visited_twice(5, path1):
   print("Sequence visits a coordinate twice")
else:
   print("Sequence does not visit a coordinate twice")
# Test case 2
path2 = [[0,0],[1,1],[2,2],[3,3],[4,4],[3,3]]
if is_visited_twice(6, path2):
   print("Sequence visits a coordinate twice")
else:
   print("Sequence does not visit a coordinate twice")

# Test case 3
path3 = [[0,0],[1,1],[2,2]]
if is_visited_twice(3, path3):
   print("Sequence visits a coordinate twice")
else:
   print("Sequence does not visit a coordinate twice")

Output

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

Test Case Example

Consider the sequence "UDDLLRUUUDU" representing the path "Up, Down, Down, Left, Left, Right, Up, Up, Down, Up".

We start at the origin (0, 0) and traverse the path, updating our coordinates as we go along.

At each step, we check whether we have already visited the new coordinate before. If yes, we know that the sequence visits a coordinate twice and we return true. If not, we mark the coordinate as visited and continue.

Here is how the algorithm works for the given sequence −

  • Starting at the origin (0, 0)

  • "U"  Move up to (0, 1). Mark (0, 1) as visited.

  • "D"  Move down to (0, 0). Mark (0, 0) as visited.

  • "D"  Move down to (0, -1). Mark (0, -1) as visited.

  • "L"  Move left to (-1, -1). Mark (-1, -1) as visited.

  • "L"  Move left to (-2, -1). Mark (-2, -1) as visited.

  • "R"  Move right to (-1, -1). This coordinate has been visited before, so we return true.

Since the sequence visits a coordinate twice, the function returns true.

Therefore, for the given sequence "UDDLLRUUUDU", the function correctly returns that the sequence visits a coordinate twice.

Conclusion

In this article, we discussed how to check if a sequence of path visits any coordinate twice or not. We used a hash table to keep track of all the coordinates that we have visited so far, and checked for duplicates at each step. We also provided an implementation of this algorithm in C

Updated on: 16-Oct-2023

68 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements