BZOJ 3385: [Usaco2004 Nov]Lake Counting 数池塘

题目

3385: [Usaco2004 Nov]Lake Counting 数池塘

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

    农夫约翰的农场可以表示成N×M(1≤N,M≤100)个方格组成的矩形.由于近日的降雨,
在约翰农场上的不同地方形成了池塘.每一个方格或者有积水(’W’)或者没有积水(’.’).农夫约翰打算数出他的农场上共形成了多少池塘.一个池塘是一系列相连的有积水的方格,每一个方格周围的八个方格都被认为是与这个方格相连的.
    现给出约翰农场的图样,要求输出农场上的池塘数.

Input

    第1行:由空格隔开的两个整数N和M.
    第2到N+1行:每行M个字符代表约翰农场的一排方格的状态.每个字符或者是’W’或者
是’.’,字符之间没有空格.

Output

    约翰农场上的池塘数.

 

Sample Input

10 12
W ........ WW.
. WWW ..... WWW
.... WW ... WW.
......... WW.
......... W..
..W ...... W..
.W.W ..... WW.
W.W.W ..... W.
.W.W ...... W.
..W ....... W.

Sample Output

3

HINT

 

    共有3个池塘:一个在左上角,一个在左下角,还有一个沿着右边界

题解

我用floodfill做的,呵呵,时间Rank倒数第一= =

代码

 1 /*Author:WNJXYK*/
 2 #include<cstdio>
 3 #include<iostream>
 4 using namespace std;
 5 int n,m;
 6 const int Maxn=100;
 7 bool map[Maxn+10][Maxn+10];
 8 bool visited[Maxn+10][Maxn+10]; 
 9 inline char read(){
10     char ch=getchar();
11     while(ch!='.' && ch!='W') ch=getchar();
12     return ch;
13 } 
14 int cnt=0;
15 int dx[]={0,-1,-1,0,1,1,1,0,-1};
16 int dy[]={0,0,1,1,1,0,-1,-1,-1};
17 void floodfill(int x,int y){
18     visited[x][y]=true;
19     for (int k=1;k<=8;k++){
20         int nx=x+dx[k],ny=y+dy[k];
21         if (1<=nx && nx<=n && 1<=ny && ny<=m)
22             if (map[nx][ny]==true)
23                 if (visited[nx][ny]==false)
24                     floodfill(nx,ny);
25     }
26 }
27 
28 int main(){
29     scanf("%d%d",&n,&m);
30     for (int i=1;i<=n;i++){
31         for (int j=1;j<=m;j++){
32             char ch=read();
33             if (ch=='.') map[i][j]=false;
34             if (ch=='W') map[i][j]=true;
35             visited[i][j]=false;
36         }
37     }
38     for (int i=1;i<=n;i++){
39         for (int j=1;j<=m;j++){
40             if (visited[i][j]==false&&map[i][j]==true){
41                 floodfill(i,j);
42                 cnt++;
43             } 
44         } 
45     }
46     printf("%d\n",cnt);
47     return 0;
48 }
View Code

 

你可能感兴趣的:(USACO)