Лучшая точка встречи в двоичном 2D-массиве

Опубликовано: 19 Января, 2022

Вам предоставляется двухмерная сетка значений 0 или 1, где каждая единица обозначает дом кого-то в группе. А группа из двух или более человек хочет встретиться и минимизировать общее расстояние путешествия. Они могут встретиться где угодно, значит, может быть дом или нет.

  • Расстояние рассчитывается с использованием Манхэттенского расстояния, где расстояние (p1, p2) = | p2.x - p1.x | + | p2.y - p1.y |.
  • Найдите общее расстояние, которое необходимо преодолеть, чтобы добраться до наилучшего места встречи (общее пройденное расстояние минимально).

Примеры:

Ввод: сетка [] [] = {{1, 0, 0, 0, 1}, 
                   {0, 0, 0, 0, 0},
                   {0, 0, 1, 0, 0}};
Выход: 6
Лучшее место встречи - (0, 2).
Общее пройденное расстояние 2 + 2 + 2 = 6

Ввод: сетка [3] [5] = {{1, 0, 1, 0, 1},
                     {0, 1, 0, 0, 0}, 
                     {0, 1, 1, 0, 0}};
Выход: 11

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

Шаги: -
1) Сохраните все горизонтальные и вертикальные положения всех членов группы.
2) Теперь отсортируйте его, чтобы найти минимальное среднее положение, которое будет лучшим местом встречи.
3) Найдите удаленность всех участников от наилучшего места встречи.

Например, на диаграмме выше горизонтальные позиции - это {0, 2, 0}, а вертикальные позиции - {0, 2, 4}. После сортировки обоих мы получаем {0, 0, 2} и {0, 2, 4}. Средняя точка - (0, 2).

Note : Even no. of 1’s have two middle points, then also it works. Two middle points means it have two best meeting points always. Both cases will give same distance. So we will consider only one best meeting point to avoid the more overhead, Because our aim is to find the distance only.

C++

/* C++ program to find best meeting point in 2D array*/
#include <bits/stdc++.h>
using namespace std;
#define ROW 3
#define COL 5
  
int minTotalDistance(int grid[][COL]) {
    if (ROW == 0 || COL == 0) 
         return 0;
      
    vector<int> vertical;
    vector<int> horizontal;
      
    // Find all members home"s position 
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            if (grid[i][j] == 1) {
                vertical.push_back(i);
                horizontal.push_back(j);
            }
        }
    }
      
    // Sort positions so we can find most 
    // beneficial point
    sort(vertical.begin(),vertical.end());
    sort(horizontal.begin(),horizontal.end());
      
    // middle position will always beneficial 
    // for all group members but it will be
    // sorted which we have alredy done
    int size = vertical.size()/2;
    int x = vertical[size]; 
    int y = horizontal[size];
      
    // Now find total distance from best meeting 
    // point (x,y) using Manhattan Distance formula
    int distance = 0;
    for (int i = 0; i < ROW; i++) 
        for (int j = 0; j < COL; j++) 
            if (grid[i][j] == 1) 
                distance += abs(x - i) + abs(y - j);
      
    return distance;
}
  
// Driver program to test above functions
int main() {
    int grid[ROW][COL] = {{1, 0, 1, 0, 1}, {0, 1, 0, 0, 0},{0, 1, 1, 0, 0}};
    cout << minTotalDistance(grid);
    return 0;
}

Java

/* Java program to find best 
meeting point in 2D array*/
import java.util.*;
  
class GFG 
{
      
static int ROW = 3;
static int COL =5 ;
  
static int minTotalDistance(int grid[][])
    if (ROW == 0 || COL == 0
        return 0
      
    Vector<Integer> vertical = new Vector<Integer>(); 
    Vector<Integer> horizontal = new Vector<Integer>();
      
    // Find all members home"s position 
    for (int i = 0; i < ROW; i++)
    
        for (int j = 0; j < COL; j++) 
        
            if (grid[i][j] == 1
            
                vertical.add(i); 
                horizontal.add(j); 
            
        
    
      
    // Sort positions so we can find most 
    // beneficial point 
    Collections.sort(vertical); 
    Collections.sort(horizontal); 
      
    // middle position will always beneficial 
    // for all group members but it will be 
    // sorted which we have alredy done 
    int size = vertical.size() / 2
    int x = vertical.get(size); 
    int y = horizontal.get(size); 
      
    // Now find total distance from best meeting 
    // point (x,y) using Manhattan Distance formula 
    int distance = 0
    for (int i = 0; i < ROW; i++) 
        for (int j = 0; j < COL; j++) 
            if (grid[i][j] == 1
                distance += Math.abs(x - i) +
                Math.abs(y - j); 
      
    return distance; 
  
// Driver code
public static void main(String[] args) 
{
    int grid[][] = {{1, 0, 1, 0, 1}, 
                    {0, 1, 0, 0, 0},
                    {0, 1, 1, 0, 0}};
    System.out.println(minTotalDistance(grid));
}
  
// This code is contributed by 29AjayKumar

Python3

# Python program to find best meeting point in 2D array
ROW = 3
COL = 5
  
def minTotalDistance(grid: list) -> int:
    if ROW == 0 or COL == 0:
        return 0
  
    vertical = []
    horizontal = []
  
    # Find all members home"s position
    for i in range(ROW):
        for j in range(COL):
            if grid[i][j] == 1:
                vertical.append(i)
                horizontal.append(j)
  
    # Sort positions so we can find most
    # beneficial point
    vertical.sort()
    horizontal.sort()
  
    # middle position will always beneficial
    # for all group members but it will be
    # sorted which we have alredy done
    size = len(vertical) // 2
    x = vertical[size]
    y = horizontal[size]
  
    # Now find total distance from best meeting
    # point (x,y) using Manhattan Distance formula
    distance = 0
    for i in range(ROW):
        for j in range(COL):
            if grid[i][j] == 1:
                distance += abs(x - i) + abs(y - j)
  
    return distance
  
# Driver Code
if __name__ == "__main__":
  
    grid = [[1, 0, 1, 0, 1],
            [0, 1, 0, 0, 0], 
            [0, 1, 1, 0, 0]]
    print(minTotalDistance(grid))
  
# This code is contributed by
# sanjeev2552

C#

/* C# program to find best 
meeting point in 2D array*/
using System;
using System.Collections.Generic;
  
class GFG 
{
      
static int ROW = 3;
static int COL = 5 ;
  
static int minTotalDistance(int [,]grid)
    if (ROW == 0 || COL == 0) 
        return 0; 
      
    List<int> vertical = new List<int>(); 
    List<int> horizontal = new List<int>();
      
    // Find all members home"s position 
    for (int i = 0; i < ROW; i++)
    
        for (int j = 0; j < COL; j++) 
        
            if (grid[i, j] == 1) 
            
                vertical.Add(i); 
                horizontal.Add(j); 
            
        
    
      
    // Sort positions so we can find most 
    // beneficial point 
    vertical.Sort(); 
    horizontal.Sort(); 
      
    // middle position will always beneficial 
    // for all group members but it will be 
    // sorted which we have alredy done 
    int size = vertical.Count / 2; 
    int x = vertical[size]; 
    int y = horizontal[size]; 
      
    // Now find total distance from best meeting 
    // point (x,y) using Manhattan Distance formula 
    int distance = 0; 
    for (int i = 0; i < ROW; i++) 
        for (int j = 0; j < COL; j++) 
            if (grid[i, j] == 1) 
                distance += Math.Abs(x - i) +
                Math.Abs(y - j); 
      
    return distance; 
  
// Driver code
public static void Main(String[] args) 
{
    int [,]grid = {{1, 0, 1, 0, 1}, 
                    {0, 1, 0, 0, 0},
                    {0, 1, 1, 0, 0}};
    Console.WriteLine(minTotalDistance(grid));
}
  
// This code is contributed by PrinciRaj1992

Выход:

11

Сложность времени: O (M * N)
Вспомогательное пространство: O (N)

Эта статья предоставлена Harshit Agrawal . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью на сайте deposit.geeksforgeeks.org или отправить свою статью по электронной почте: grant@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.