簡単なブロック通信の問題

 

 

 

 

 

 

 

         

 

 

 DFS単純検索、通信ブロックの数を取得します

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  CONST  INT MAXN = 350 4  チャーMP [MAXN] [MAXN]、フラグ[MAXN] [MAXN]。
5  int型のヘッド[ 4 ] [ 2 ] = {{ 0、 - 1 }、{ 10 }、{ 01 }、{ - 10 }}。//四个方向
 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 }

 

 

 

おすすめ

転載: www.cnblogs.com/Edviv/p/11769015.html