n \タイムズメートルのn × グリッドマップM上、グリッドの一部は爆弾の上に置かれています。手動で爆弾を爆発させた後、爆弾は、爆弾が配置されている行と列のすべての爆弾を爆発させ、爆発した爆弾は他の爆弾を爆発させ、連鎖を続けます。
ここで、マップ上のすべての爆弾を爆発させるには、一部の爆弾を手動で爆発させる必要があります。危険を最小限に抑えるために、手動で爆発できる爆弾の数を計算してください。
入力フォーマット
最初の行に 2つの整数 n、m n 、mをスペースで区切って入力します。
次の n n行では、マップ情報を表すために、各行に長さm mの文字列を入力し ます。爆弾を意味しない、爆弾を意味する。0
1
データ規約:
以下のための 60 \%6。0 データの%:1 \ N-LE、M \ 100ル。1。≤ N- 、M ≤ 1。0 0。
以下のための 100 \%。1 0 0 %のデータ:1 \ N-LE、M \ 1000年ル。1 ≤ N- 、M ≤ 。1 0 0 0。
データ量が比較的多いため、cin
入力は推奨されません。
出力フォーマット
手動で爆発させる必要がある爆弾の最小数を示す整数が出力されます。
入力例
5 5 00010 00010 01001 10001 01000
出力例
2
解決策:
最初に1番爆弾に点火して2、3、4、5、6番爆弾を爆発させると、2番爆弾に初めて点火すると1、3、4、5番爆弾も爆発する可能性があることを最初に理解する必要があります。 6番爆弾、3番、4番、5番、6番爆弾も同じ
次に、ランダムに爆弾を選択して点火し、この爆弾によって点火された爆弾を削除してから、残りの爆弾から1つを選択し、爆弾がなくなるまで順番に進みます
コード:
1 #include <stdio.h> 2 #include < string .h> 3 #include <iostream> 4 #include <algorithm> 5 #include <math.h> 6 #include <vector> 7 #include <queue> 8# include <map> 9 名前空間std を使用 ; 10 typedef long long ll; 11 const int maxn = 1010 ; 12 const int INF = 0x3f3f3f3f ; 13 int Map [maxn] [maxn]; 14 int m、n、ans = 0 ; 15 int row [maxn]; 16 int col [maxn]; 17 int dfs(int i、int j) 18 { 19 Map [i] [j] = 0 ; 20 if(!col [j]) 21 { 22 col [j] = 1 ; 23 for(int k = 1 ; k <= n; k ++ ) 24 { 25 if(Map [k] [j] == 1 ) 26 { 27 dfs(k、j); 28 // Map [k] [j] = 0; 29 } 30 31 } 32 } 33 if(!row [i]) 34 { 35 row [i] = 1 ; 36 for(int l = 1 ; l <= m; l ++ ) 37 { 38 if(Map [i] [l] == 1 ) 39 { 40 dfs(i、l); 41 // Map [i] [l] = 0; 42 } 43 44 } 45 } 46 } 47 int main() 48 { 49 scanf(" %d%d "、&n、&m); 50 for(int i = 1 ; i <= n; i ++ ) 51 { 52 for(int j = 1 ; j <= m; j ++ ) 53 { 54 scanf(" %1d "、&Map [i] [j]); // %1dは、数値を入力して入力を終了する 55 } 56 } 57 for(int i = 1 ; i <= n; i ++ ) 58 { 59 for(int j = 1 ; j <= m; j ++ ) 60 { 61 if(Map [i] [j] == 1 ) 62 { 63 dfs(i、j); 64 ans ++ ; 65 } 66 } 67 } 68 printf(" %d \ n " 、ans); 69 0を返します。 70 }