塗りつぶし-DFS

ファーマージョンは長方形の土地N * MN * Mさんがあります。
最近では、降雨による、土地の一部は水でカバー。
今、彼の土地を表現する文字行列と。
各セル内では、「W」で、雨水が含まれている場合、雨、使用を除いた場合、示しています。「」図。
さて、ジョンは池の数の形成に土地の彼の作品を知りたいと思いました。
水に接続された各セルは、収集池として見ることができます。
その考え各セルは、下部、左、右、左上、右上、左下、右下の8近傍のセルに接続されています。
してください出力片池の総数は、多くの作品があるかマトリックスに接続されている「W」ブロック。
入力形式は、
最初の行は二つの整数NNとMMが含まれています。
次NNは線、MM文字を含む各行、文字「W」または「」、文字間のスペースなしで、土地の水矩形の状態を示します。
出力フォーマット
出力池の数を表す整数。
データ範囲
1≤N、M≤10001≤N、M≤1000
入力サンプル:
10〜12であり
、Wは...のWW。
.WWW WWW ...
のWWの... WW ...
...のWW。
... Wは...
... ... Wは、Wがである...
.WW ... WWの。
W ... WWW。
.WW ... W.
... W ... W.

出力例:
3

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1010,M=N*N;
#define x first
#define y second 
typedef pair<int,int> PII;
int n,m;
char g[N][N];
PII q[M];
bool st[N][N];
void bfs(int sx,int sy){
 int hh=0,tt=0;
 q[0]={sx,sy};
 st[sx][sy]=true;
 while(hh<=tt){
  PII t=q[hh++];
  for(int i=t.x-1;i<=t.x+1;i++)
    for(int j=t.y-1;j<=t.y+1;j++){
     if(i==t.x && j==t.y)   continue;
     if(i<0 || i>=n || j<0 || j>=m)   continue;
     if(g[i][j]=='.' || st[i][j])   continue;
     q[++tt]={i,j};
     st[i][j]=true;
    }
 }
}
int main(){
 scanf("%d%d",&n,&m);
 for(int i=0;i<n;i++)   scanf("%s",g[i]);
 int cnt=0;
 for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
       if(g[i][j]=='W'&& !st[i][j]){
        bfs(i,j);
        cnt++;
    }
 printf("%d\n",cnt);
 return  0;
}
发布了37 篇原创文章 · 获赞 28 · 访问量 3821

おすすめ

転載: blog.csdn.net/qq_45772483/article/details/104409493