Dada una array arr[] de puntos de coordenadas y un punto de coordenadas de origen y final, la tarea es encontrar la distancia mínima manhattan recorrida desde la fuente hasta el vértice final de modo que cada punto de la array se visite exactamente una vez.
Distancia Manhattan =
Ejemplos:
Entrada: fuente = (0, 0), final = (100, 100)
arr[] = {(70, 40), (30, 10), (10, 5), (90, 70), (50, 20 )}
Salida: 200
Entrada: fuente = (0, 0), final = (5, 5)
arr[] = {(1, 1)}
Salida: 10
Enfoque: La idea es utilizar la permutación y la combinación para generar todos los movimientos de permutación posibles a las coordenadas y luego calcular la distancia total de Manhattan recorrida moviéndose desde la primera coordenada de la array a la coordenada final y si la final distancia recorrida es menor que la distancia mínima recorrida hasta ahora. Luego actualice la distancia mínima recorrida.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation to find the // minimum manhattan distance // covered by visiting N co-ordinates #include <bits/stdc++.h> using namespace std; // Class of co-ordinates class pairs { public: int x; int y; }; // Function to calculate the // manhattan distance between // pair of points int calculate_distance(pairs a, pairs b) { return abs(a.x - b.x) + abs(a.y - b.y); } // Function to find the minimum // distance covered for visiting // every co-ordinate point int findMinDistanceUtil(vector<int> nodes, int noOfcustomer, int** matrix) { int mindistance = INT_MAX; // Loop to compute the distance // for every possible permutation do { int distance = 0; int prev = 1; // Computing every total manhattan // distance covered for the every // co-ordinate points for (int i = 0; i < noOfcustomer; i++) { distance = distance + matrix[prev][nodes[i]]; prev = nodes[i]; } // Adding the final distance distance = distance + matrix[prev][0]; // if distance is less than // minimum value than update it if (distance < mindistance) mindistance = distance; }while ( next_permutation( nodes.begin(), nodes.end() )); return mindistance; } // Function to initialize the input // and find the minimum distance // by visiting every coordinate void findMinDistance() { int noOfcustomer = 1; vector<pairs> coordinate; vector<int> nodes; // filling the coordinates into vector pairs office, home, customer; office.x = 0; office.y = 0; coordinate.push_back(office); home.x = 5; home.y = 5; coordinate.push_back(home); customer.x = 1; customer.y = 1; coordinate.push_back(customer); // make a 2d matrix which stores // distance between two point int** matrix = new int*[noOfcustomer + 2]; // Loop to compute the distance between // every pair of points in the co-ordinate for (int i = 0; i < noOfcustomer + 2; i++) { matrix[i] = new int[noOfcustomer + 2]; for (int j = 0; j < noOfcustomer + 2; j++) { matrix[i][j] = calculate_distance( coordinate[i], coordinate[j]); } // Condition to not move the // index of the source or // the final vertex if (i != 0 && i != 1) nodes.push_back(i); } cout << findMinDistanceUtil( nodes, noOfcustomer, matrix); } // Driver Code int main() { // Function Call findMinDistance(); return 0; }
10
Análisis de rendimiento:
- Complejidad temporal: O(N! * N)
- Espacio Auxiliar: O(N 2 )
Publicación traducida automáticamente
Artículo escrito por mansibhardwaj009 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA