住所 https://leetcode-cn.com/submissions/detail/39277402/
タイトル説明は
あなたを与えるA MXNバイナリ行列マット。
各ステップは、あなたが(反転は0、1から1 0に示す。)細胞およびその反転を選択することができます。それと隣接するセルが存在する場合は、これらの隣接するセルが逆になります。(注:同じ側を共有する二つの隣接するセル)。
すべてゼロの行列にない場合は、逆の最小数とゼロの行列に行列マットに戻ってください、戻ってください-1。
各グリッドバイナリ行列は、0または1です。
すべてのゼロ行列は、グリッドがゼロであるすべての行列です。
実施例 1 : 入力:MAT = [ 0、0 ]、[ 0、1 ]] 出力:3 つの可能な解決策反転する(:説明1、0)及び(0、1、最終的に)と(1、1 )。 例2 : 入力:MAT = [[ 0 ] 出力:0 説明:あなたはそれを変更する必要があるので、マトリックスすべてゼロの行列は、与えられています。 実施例3 : 入力:MAT = [ 1、1、1 ]、[ 1、0、1 ]、[ 0、0、0 ] 出力:6 例4 : 入力:MAT = [ 1、0、0 ]、[ 1、0、0 ] 出力: - 1 説明:この行列は、すべてゼロに変更することはできませんマトリックスは、 ヒント: M == mat.length N- == MAT [ 0 ] .LENGTH 1 <= M <= 3 1 <= N - <= 3 MAT [I] [J]が0または1。
アルゴリズム1
95.不可解なスイッチacwing116をacwingと、この質問。同様のパイロット兄弟
第一層の最後の層に答えるために、いくつかの順次のプッシュスイッチにより、必要なときにどのようにすべてゼロにいくつかのスイッチをである第二の層によって必要なときにどのようにすべてゼロを考えてみましょう
大きなデータ範囲の場合にも双方向BFS探索範囲を最適化するために使用することができます
範囲が比較的小さい私は、比較的ラフな簡単なBFSを取っていたされているので
状態を考慮BFSタイトルに来て見るために開始点として、すべてゼロの状態から、いくつかの必要があり
、簡単に
直接2次元配列を使用しなくてもキーの状態のノートを取るために圧縮変形
が、コードを理解することは比較的容易である
コードを次のようになります。
1 クラスソリューション{ 2 公共: 3 4地図<ベクトル<ベクトル< INT >>、INT > 訪問。 5キュー<ペア<ベクトル<ベクトル< int型 >>、int型 >> Q; 6 BOOL CheckIsAllZero(constのベクトル<ベクトル< INT >>&マット) 7 { 8 のための(INTは私= 0 ; I <mat.size(); I ++ ){ 9が ため(INT J = 0 ; J <マット[ 0]。サイズ(); J ++ ){ 10 であれば(MAT [I] [J] =!0 ) 11 リターン 偽。 12 } 13 } 14 15 リターン 真。 16 } 17 18 19 空隙クリック(ベクトル<ベクトル< INT >>&currenrState、int型のx、int型Y) 20 { 21 のint ADDX [ 4 ] = { 1、 - 1、0、0 }。 22 INTアディ[ 4 ] = { 0、0、 - 1、1 }。 23 24 currenrState [X] [Y] = currenrState [X] [Y]?0:1 。 25 26 のために(INT iは= 0 ; iは< 4 ; I ++ ){ 27 、INT newx = X + ADDX [I]; 28 INT newy = Y + アディ[I]。 29 30 であれば(newx> = 0 && newx <currenrState.size()&& newy> = 0 && newy <currenrState [ 0] .size()){ 31 currenrState [newx] [newy] = currenrState [newx] [newy]?0:1 。 32 } 33 } 34 } 35 36 37 INT minFlips(ベクトル<ベクトル< INT >>&マット){ 38 であれば(CheckIsAllZero(マット))戻り 0 ; 39 40 ベクター<ベクトル< INT >> matAllZero(mat.size()、ベクトル< INT >(MAT [ 0 ] .size()))。 41 42 INTの距離= 0 。 43 44 訪問[matAllZero] = 距離。 45 q.push({matAllZero、距離})。 46 47 ながら(!q.empty()){ 48 オートQE = q.front()。 49 q.pop(); 50 ベクトル<ベクトル< INT >> currenrState = qe.first。 51 INT CURRENTCOUNT = qe.second。 52 53 // 尝试点击该XY 54 のために(INT iが= 0 ; I <currenrState.sizeは(); I ++ ){ 55 のために(INT J =0 ; J <currenrState [ 0 ] .size()。J ++ ){ 56 ベクトル<ベクトル< INT >>コピー= currenrState。 57 クリック(コピー、i、j)は、 58 59 60 であれば(コピー== マット) 61 { 62 リターン CURRENTCOUNT + 1 。 63 } 64 65 であれば(visit.count(コピー)== 0 ){ 66 q.push({コピー、CURRENTCOUNT + 1 })。 67 訪問[コピー] = CURRENTCOUNT + 1 ; 68 } 69 } 70 } 71 } 72 73 74 リターン - 1 。 75 } 76 77 }。