우체국 II 구축

기술

2 차원 그리드 감안할 때, 각각의 셀은 벽 중 하나입니다  2 , 집을  1  나 비어  0  (수 0 개, 1 개, 2 개), 그래서 모든 주택에 우체국으로부터의 거리의 합이 있음을 우체국을 구축 할 장소를 찾기 작은.

거리의 작은 합계를 돌려줍니다. 반환  -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를 사용하여 검색이 완료됩니다.
  • 점 거리와 현재 구현 업데이트, 간단한 검색 과정 일 + = DIST BFS.
  • now.dis + 1 개의 점 사이의 거리의 각각 현재 업데이트가 이루어진다.
클래스 {좌표
    INT X, Y;
    공용 좌표 (INT의 X, Y INT) {
        this.x = X;
        this.y = Y;
    }
}

공용 클래스 솔루션 {
    공개 INT 비어 = 0;
    공개 INT HOUSE = 1;
    공개 INT 벽 = 2;
    공개 INT [] [] 그리드;
    공개 INT의 N, m;
    공개 INT []위한 deltaX = {0, 1, -1, 0};
    공개 INT [] deltaY에 = {1, 0, 0, -1};
    
    개인 목록 getCoordinates (INT 타입) <좌표> {
        목록 좌표 <좌표> = 새의 ArrayList를 <> ();
        
        대해 INT (I = 0; I N <; 나는 ++) {
            대 (INT J = 0; J <m, J ++) {
                경우 (표 [I] [J] == 형) {
                    (새 (업무 I, J)) coordinates.add;
                }
            }
        }
        
        좌표를 반환;
    }
    
    개인 무효 setGrid (INT [] [] 그리드) {
        N = grid.length;
        m = 그리드 [0] .length;
        this.grid = 격자;
    }
    
    개인 부울 인바운드 (좌표 데이터 로거, 좌표) {
        경우 (coor.x <0 || coor.x> = N) {
            false를 반환;
        }
        경우 (coor.y <0 || coor.y> = m) {
            false를 반환;
        }
        복귀 계통 [coor.x] coor.y] EMPTY ==;
    }

    / **
     2 차원 격자 파라미터 : 그리드
     * 정수 예외 :
     * /
    공개 shortestDistance INT (INT [] [] 그리드) {
        경우 (표 == 널 || grid.length == 0 || 격자 [0] .length == 0) {
            반환 -1;
        }
        
        // 세트 N, m, 그리드
        (그리드) setGrid;
        
        목록 <좌표> 주택 = getCoordinates (HOUSE);
        INT [] [] distanceSum 새로운 INT [N] [m]를 =;
        INT [] [] = visitedTimes 새로운 INT [N] [m];
        대한 (집 좌표 : 집) {
            BFS (집, distanceSum, visitedTimes);
        }
        
        최단 = INT는 Integer.MAX_VALUE;
        목록 <좌표> 빈 병 = getCoordinates (비어 있음);
        대한 (빈 좌표 : 빈 상자를) {
            경우 (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] [m]를 =;
        
        queue.offer (개시);
        해시 [start.x] start.y] = 참;
        
        INT 단계 = 0;
        동안 (! queue.isEmpty ()) {
            ++ 단계;
            INT queue.size 크기 = ();
            대 (INT 온도 = 0; 온도 <사이즈, 임시 ++) {
                () = COOR queue.poll 좌표
                대해 INT (I = 0; I <4; I ++) {
                    (새 좌표 = 형용사 좌표
                        coor.x위한 deltaX + [I]
                        coor.y + deltaY에 [I]
                    );
                    만약 (! 인바운드 (형용사)) {
                        계속하다;
                    }
                    경우 (해쉬 [adj.x] adj.y]) {
                        계속하다;
                    }
                    queue.offer (ADJ);
                    해시 [adj.x] adj.y] = 참;
                    distanceSum [adj.x] adj.y] + = 단계;
                    visitedTimes [adj.x] adj.y] ++;
                } // 방향
            } // 온도에 대한
        } // 동안
    }
}

  

추천

출처www.cnblogs.com/FLAGyuri/p/12078548.html