DFS単純検索、通信ブロックの数を取得します
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 CONST INT MAXN = 350 。 4 チャーMP [MAXN] [MAXN]、フラグ[MAXN] [MAXN]。 5 int型のヘッド[ 4 ] [ 2 ] = {{ 0、 - 1 }、{ 1、0 }、{ 0、1 }、{ - 1、0 }}。//四个方向 6 int型N、M、Q、ANS。 7つの 8 ボイド DFS(int型のx、int型のY) 9 { 10 MP [X] [Y] = ' 0 ' ; //タグがもはやアクセス可能である、訪問しない 11。 ための(int型 I = 0 ;私は< 4。 ; Iは++ ) 12れる { 13は、 INT DX = X +ヘッド[I] [ 0 ]; // X方向 14 のintのDy = Y + [I]ヘッド[ 1 ]; // Y方向 15 IF(MP [DX] [のDy] == ' 1 ' && DX> = 1 && DX <= Dyを&& N-> = 1 && DY <= M)//検索マップ 16 { 17 MP [DX] [のDy] =' 0 ' ; //タグは、訪問 18れる DFS(DX、のDy); //再帰検索 。19 } 20 } 21である } 22である INT メイン() 23である { 24 CIN >> N- M、 25 のために(int型私は= 1。 ;私は<= N; I ++の)//マップ入力のn行m列 26である ため(INT J = 1。 ; J <= M; J ++ ) 27 CIN >> MP [I]、[J]; 28 CIN >> Q。 29 一方、(Q - ) 30 { 31は ANS = 0 ; 32 int型X1、Y1、X2、Y2、 33である CINのX1 >> X2 >> >> Y1 、Y2 34である ため(int型 I = X1と、私は= X2を<; I ++の)// X1、 X2にY1、デジタルY2領域となる1。 35 用(INT J = Y1; J <= Y2、J ++ ) 36 MP [I] [J] = ' 1 ' ; 37 38である ため(int型私は= 1 ; Iは< N- =; I ++ ) 39 のための(INT J = 1。 ; J <= M; J ++) 40 フラグに[I] [J] = MP [I]、[J]; //現在の状態をセーブ 41は 42である ため(int型 Iは= 1 ; I <= N; Iは++ )//サーチ 43は 、{ 44である ため(INT J = 。1 ; J <= M; J ++ ) 45 { 46は、 IF(MP [I] [J] == ' 1 ' ) 47 { 48 ANS ++ ; //;プラス接続ブロック数1。 49 DFS(I、J); 50 } 51 } 52である } 53は、 54である ため(INT I = 1 ; I <= N; I ++ ) 55 のための(INT J = 1。 ; J <= M; J ++ ) 56である MP [I] [J] = フラグ[I]、[J]で; //縮小図の前に検索を検索。 57がある のprintf(" %Dの\のN- " 、ANS); //出力通信ブロックの数を 58 } 59 リターン 0 ; 60 }