Строить Почтовое отделение II

Описание

Учитывая 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] ++; 
                } // направление 
            } // для температуры 
        } // пока 
    } 
}

  

рекомендация

отwww.cnblogs.com/FLAGyuri/p/12078548.html
рекомендация