Описание
Учитывая 2D сетки, каждая ячейка является либо стеной
2
, Домом
1
или опорожнить
0
(число ноль, один, два), найти место , чтобы построить почтовое отделение , так что сумма расстояния от почтового отделения всех домов маленький.
Возвращает наименьшее сумму расстояния. Возврат , -1
если это не представляется возможным.
- Вы не можете пройти через стены и дома, но может пройти через пустой.
- Вы только построить почтовое отделение на пустой.
пример
Пример 1:
Input:[[0,1,0,0,0],[1,0,0,2,1],[0,1,0,0,0]]
Output:8
Explanation: Placing a post office at (1,1), the distance that post office to all the house sum is smallest.
Пример 2:
Input:[[0,1,0],[1,0,1],[0,1,0]]
Output:4
Explanation: Placing a post office at (1,1), the distance that post office to all the house sum is smallest.
Вызов
Решить эту проблему в течение O(n^3)
времени.
Идеи:
- Название использует BFS, пересекая сетку в первый раз, который будет находиться в пустых BFS, поиск завершен, если они присутствуют, дома не визави отмечают изменение открытого пространства не может быть предоставлено в домашних условиях.
- BFS простого процесса поиска, солнце + = расстояние, расстояние точки и текущие обновления реализации.
- now.dis + 1 каждое обновление текущего расстояния между двумя точками достигается.
класс координат { INT х, у; общественных координат (Int, Int х у) { this.x = х; this.y = у; } } Общественного класса Решение { общественного ИНТ EMPTY = 0; общественного ИНТ HOUSE = 1; ИНТ WALL общественности = 2; общественного ИНТ [] [] сетки; общественный ИНТ п, м; общественного INT [] DeltaX = {0, 1, -1, 0}; общественного INT [] deltaY = {1, 0, 0, -1}; частный List <координата> getCoordinates (интермедиат тип) { List <координата> координаты = новый ArrayList <> (); для (INT I = 0; я <п; я ++) { для (Int J = 0; J <т; j ++) { если (сетка [I] [J] == тип) { coordinates.add (новая координата (I, J)); * @param сетки 2D - сетки } } } Возвращают координаты; } Частная пустота setGrid (INT [] [] сетка) { п = grid.length; м = сетки [0] .length; this.grid = сетка; } Частное логическое значение Inbound (координата COOR) { если (coor.x <0 || coor.x> = п) { возвращение ложным; } Если (coor.y <0 || coor.y> = т) { возвращение ложным; } Возвращение сетки [coor.x] [coor.y] == EMPTY; } / ** * @return целочисленного * / общественного Int shortestDistance (ИНТ [] [] сетка) { если (сетка == NULL || grid.length == 0 || сетки [0] .length == 0) { возвращение -1; } // множество п, т, сетка setGrid (сетка); Список <координатные> дома = getCoordinates (дом); INT [] [] distanceSum = новый Int [N] [м]; INT [] [] visitedTimes = новый INT [N] [м]; для (Coordinate дом: дома) { BFS (дом, distanceSum, visitedTimes); } INT кратчайшее = Integer.MAX_VALUE; Список <координатного> пустеет = getCoordinates (Empty); для (координат пусто: пустышки) { если (visitedTimes [empty.x] [empty.y] = houses.size ()) { продолжить; } Кратчайший = Math.min (короткая, distanceSum [empty.x] [empty.y]); } Если (кратчайшее == Integer.MAX_VALUE) { возвращение -1; } Вернуть кратчайшим; } Частный недействительный BFS (координата начала, Int [] [] distanceSum, INT [] [] visitedTimes) { Очередь <координат> очередь = новый LinkedList <> (); логическое [] [] = хэш новый логическое значение [N] [м]; queue.offer (старт); хэш [start.x] [start.y] = TRUE; INT шаги = 0; в то время как (queue.isEmpty ()) { шагов ++; INT размер = queue.size (); для (INT Темп = 0; темп <размер; темп ++) { координата COOR = queue.poll (); для (INT I = 0; я <4; я ++) { Coordinate прил = новая координата ( coor.x + DeltaX [I], coor.y + deltaY [I] ); если (Inbound (прил)!) { продолжить; } Если (хэш [adj.x] [adj.y]) { продолжить; } Queue.offer (прил); хэш [adj.x] [adj.y] = TRUE; distanceSum [adj.x] [adj.y] + = шаги; visitedTimes [adj.x] [adj.y] ++; } // направление } // для температуры } // пока } }