Distancia mínima de Manhattan cubierta al visitar todas las coordenadas desde una fuente hasta un vértice final

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 = \left | x2 - x1 \right | + \left | y2 - y1 \right |
 

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;
}
Producción: 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *