기술
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] ++; } // 방향 } // 온도에 대한 } // 동안 } }