あなたは上の家を構築したい 空の 距離の最短量のすべての建物に到達した土地。あなただけの、上下左右に移動することができます。あなたは値0、1または2の二次元グリッドが与えられます。
- 各0は、あなたが自由にで渡すことができ、空の土地をマーク。
- 各1あなたが通過することができない建物をマーク。
- 各2あなたが通過することができない障害物をマーク。
例えば、で3つの建物を与え (0,0)
、 (0,4)
、 (2,2)
、および障害時 (0,2)
:
0 - 2 - - 1 - 0 1 | | | | | 0 - - 0 - 0 - 0 0 | | | | | 0 - 0 - - 0 1 - 0
ポイント (1,2)
= 7 3 + 3 + 1の総走行距離が最小であるように、家を構築するための理想的な空の土地です。だから、7を返します。
注意:
少なくとも一つの建物があります。それは上記の規則に従って、そのような家を建てることができない場合は、-1を返します。
アイデア:
1はそれぞれ0時からの最短距離を見つけるために、ポイントBFSによってすべての点から開始点であり、0時は、記録中回数が一点を訪問しています。だから我々は、午前1時00分にアクセスできるすべては、最も短い距離を保存し、午前1時00分のすべてを通過し、訪問の数を増加させました。最後に、すべての夜12時は、それは1時00分のすべて、および最短距離と最小にアクセス可能であるかどうかを確認するために再びトラバース。
実際には、ここでは同様のことを行うために、ゼロからスタートすることができます。その数を確認するために0または1から選択されます。誰が誰の小さなへ。
1 パブリック クラスソリューション{ 2 民間 のint [] [] DIR = 新しい INT [] [] {{ - 1、0 }、{ 1、0 }、{ 0、 - 1 }、{ 0、1 }}。 3 4 公共 INT shortestDistance(INT [] []グリッド){ 5 であれば(グリッド== NULL || grid.length == 0 ){ 6 戻り 0 ; 7 } 8 9 INT行= grid.length、COLS =グリッド[ 0 ] .LENGTH。 10 11 のint [] []に到達= 新しい INT [行] [COLS]。 12 INT [] []距離= 新しい INT [行] [COLS]。 13件 のint numBuildings = 0 。 14 15 // すべての建物からの最小距離を探す 16 のための(int型 I = 0 ; iが行を<; Iは++ ){ 17 のために(INT J = 0 ; J <COLS; jは++ ){ 18 もし(グリッド[I] [J] == 1 ){ 19 shortestDistanceHelper(I、J、グリッド、到達距離)。 20 numBuildings ++ ; 21 } 22 } 23 } 24 25 // ステップ2:すべての建物に到達分の距離をチェック 26 INT minDistance = Integer.MAX_VALUEで、 27 のためには、(int型 i = 0 ; iが行を<; iは++ ){ 28 のための(int型 J = 0 ; J <COLS; J ++ ){ 29 であれば(グリッド[I] [J] == 0 &&リーチ[I] [J] == numBuildings &&距離[I] [J] < minDistance){ 30 minDistance = 距離[I] [J]。 31 } 32 } 33 } 34 35 であれば(minDistance == Integer.MAX_VALUEの){ 36 リターン - 1 。 37 } 他{ 38 リターンminDistance。 39 } 40 } 41 42 民間 のボイドshortestDistanceHelper(int型の行、INT COL、INT [] []グリッド、値int [] []に達する、値int [] []距離){ 43個 のint行= grid.length。 44 INT COLS =グリッド[ 0 ] .LENGTH。 45 int型、D = 0 ; 46個の ブール[] []訪問= 新しいブール[行] [COLS]。 47 キュー< INT []>キュー= 新しい LinkedListの<> (); 48 queue.offer(新しい INT [] {行、COL})。 49 [行] [COL] =訪れ真。 50 ながら(!queue.isEmpty()){ 51 D ++ 。 52 INTのサイズ= queue.size()。 53 のために(INT J = 0 ; J <サイズ、J ++ ){ 54 のint []コード= queue.poll()。 55 のためには、(int型 = Iを0 ; iは< 4 ; iは++ ){ 56 のint RR = DIR [i]が[ 0 ] +コード[ 0 ]。 57 INTCC = DIR [I] [ 1 ] +コード[ 1 ]。 58 であれば(のisValidが(RR、ccは、グリッドは、訪問)){ 59 queue.offer(新しい INT [] {RR、CC})。 60 [RR] [CC]が=訪れ真。 61 リーチ[RR] [CC] ++ ; 62 距離[RR] [CC] + = D。 63 } 64 } 65 } 66 } 67 } 68 69 プライベートブールのisValid(int型の行、INT COL、INT [] []グリッド、訪問[] []ブール値){ 70個 のint行= grid.length。 71 INT COLS =グリッド[ 0 ] .LENGTH。 72 73 であれば(行< 0 ||行> =行|| COL < 0 || COL> = COLS ||訪問[行] [COL] ||グリッド[行] [COL] == 2 ){ 74 リターン 偽を; 75 } 76 リターン 真。 77 } 78 }