住所 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/
2次元マトリクスが存在する grid
(マークに、ランド上のいずれかの各位置は、 0
()符号のためのいずれかの水です 1
)。
私たちは行く4程度の隣接する領域の指示の下、1つの陸塊から各缶を進める、と我々は呼んでますすべての土地面積、に行ってきました「島」を
で完全に水に囲まれた島、海のエッジの周りのすべての隣接する土地の面積がアップしているとダウンなら、私たちは「島を閉じた。」それを呼び出します
閉じられた島の数を返却してください。
例1
入力:グリッド= [1,1,1,1,1,1,1,0]、 [1,0,0,0,0,1,1,0]、[1,0,1,0、 1,1,1,0]、[1,0,0,0,0,1,0,1]、[1,1,1,1,1,1,1,0]
出力:2
説明:
島は完全に水に囲まれているため、島島灰色の領域は、閉じている(すなわち、領域が囲まれています)。
例2
入力:グリッド= [0,0,1,0,0]、 [0,1,0,1,0]、[0,1,1,1,0]
出力:1
例3
入力:グリッド= [1,1,1,1,1,1,1]、
[1,0,0,0,0,0,1]、
[1,0,1,1,1,0、 1]、
[1,0,1,0,1,0,1]、
[1,0,1,1,1,0,1]、
[1,0,0,0,0,0,1] 、
[1,1,1,1,1,1,1]
出力:2
DFSを使用すると、0の境界線で通信した場合の問題に対する基本的な解決策を見つけることです
ここはアイデアやチェックの別のセットを提供します
島の最後の残りのセットを削除するために伝え、その後、すべての検出マージ土地0土地の境界のマーカーとは、閉じられました
コード
1 クラスソリューション{ 2 公共: 3 4 INT MAX_NUM。 5ベクトル<ベクトル< int型 >> フィールド。 6ベクター< INT > FA。 7ベクター< INT > ADDX。 8ベクトル< 整数 > アディ。 9 ボイドのinit(int型N) 10 { 11 のために(INTは iは= 0 ; iが<= N; I ++ ) 12 のFA [I] = I。 13 } 14 のint GET(INT X) 15 { 16 リターン FA [X] X X == :? FA [X] = GET(FA [X]); // 鎖構造を防ぐためにパスコンプレッサ、 17 } 18である ボイド(マージINT X、INT Y) 。19 { 20は、 FA [ GET(X)] = GET (Y) 21である } 22である // ======================= ========================= 23で 無効確認(int型の X、int型 Y、ベクトル<ベクトル< int型 >>&グリッド) 24 { 25 のために(INT iは= 0 ; I < 4 ; I ++ ){ 26 、INT newx = X + ADDX [I]; 27 INT newy = Y + アディ[I]。 28 29 であれば(newx> = 0 && newx <grid.size()&& newy> = 0 && newy <グリッド[ 0 ] .size() 30 &&グリッド[newx] [newy] == 0 ) 31 { 32 INT IDX = X *グリッド[ 0 ] .size()+ Y。 33 INTanotherIdx = newx *グリッド[ 0 ] .size()+ newy。 34 マージ(IDX、anotherIdx)。 35 } 36 } 37 } 38 39 INT closedIsland(ベクトル<ベクトル< INT >>&グリッド){ 40 MAX_NUM = 110 。 41 フィールド=ベクトル<ベクトル< INT >>(MAX_NUM、ベクトル< INT > (MAX_NUM))。 42 FA =ベクトル< 整数 >(MAX_NUM * MAX_NUM + 1 )。 43 INIT(MAX_NUM * MAX_NUM)。 44 ADDX =ベクトル< 整数 > { 1、 - 1、0、0 }。 45 アディ=ベクトル< INT > { 0、0、 - 1、1 }。 46 のために(INT iが= 0 ; I <grid.size(); I ++ ){ 47 のために(INT J = 0 ; J <グリッド[ 0 ] .size(); J ++ ){ 48 であれば(グリッド[I] [jが] == 0 ){ 49 チェック(I、J、グリッド)。 50 } 51 } 52 } 53 54 セット < INT > S。 55 56 のために(INT iが= 0 ; I <grid.size(); I ++ ){ 57 のために(INT J = 0 ; J <グリッド[ 0 ] .size(); J ++ ){ 58 であれば(グリッド[i]は[ J] == 0 ){ 59 INT IDX = I *グリッド[ 0 ] .size()+ J。 60 s.insert(GET (IDX)); 61 } 62 } 63 } 64 65 // エッジランド除去に関連する統計の互いに素なセットから 66の ための(INT I = 0 ; I <grid.size(); I ++ ){ 67 のために(INT J = 0 ; J <グリッド[ 0 ] .size(); J ++ ){ 68 IF(グリッド[I] [J] == 0 &&(I == 0 || I grid.size ==() - 1 || J == 0グリッドJ == || [ 0 ] .size() - 1 )){ 69 、INTIDX = I *はグリッド[ 0 ] .size()+ J。 70 s.erase(GET (IDX)); 71 } 72 } 73 } 74 75 戻りs.size()。 76 } 77 78 }。