首页 > 代码库 > NOI 题库 1388

NOI 题库 1388

1388  Lake Counting

描述
Due to recent rains, water has pooled in various places in Farmer John‘s field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water (‘W‘) or dry land (‘.‘). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.

Given a diagram of Farmer John‘s field, determine how many ponds he has.
输入
* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: M characters per line representing one row of Farmer John‘s field. Each character is either ‘W‘ or ‘.‘. The characters do not have spaces between them.
输出
* Line 1: The number of ponds in Farmer John‘s field.
样例输入
10 12W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W...W.......W.
样例输出
3
提示
OUTPUT DETAILS:

There are three ponds: one in the upper left, one in the lower left,and one along the right side.
来源
USACO 2004 November
技术分享
 1 #include "bits/stdc++.h" 2  3 using namespace std ; 4 const int maxN = 210 ; 5  6 const int dx[ 10 ] = { 0 , 0 , 1 , 1 , 1 , -1 , -1 , -1 } ; 7 const int dy[ 10 ] = { 1 , -1 , 1 , 0 , -1 , 1 , 0 , -1 } ; 8  9 int mp[ maxN ][ maxN ] ;10 11 void DFS ( const int xi , const int yi ) {12         if ( !mp[ xi ][ yi ] )return ;13         mp[ xi ][ yi ] = false ;14         for ( int i=0 ; i<8 ; ++i ) {15                 int xx = xi + dx[ i ] ;16                 int yy = yi + dy[ i ] ;17                 DFS( xx , yy ) ;18         }19 }20 21 int main ( ) {22         int N , M  ;23         int _cnt = 0 ; 24         scanf ( "%d%d" , &N , &M ) ; 25         getchar ( ) ;26         for ( int i=1 ; i<=N ; ++i ) {27                 for ( int j=1 ; j<=M ; ++j ) {28                         if ( getchar ( ) == W ) mp[ i ][ j ] = true ; 29                 }30                 getchar ( ) ;31         }32                 33         for ( int i=1 ; i<=N ; ++i ) {34                 for ( int j=1 ; j<=M ; ++j ) {35                         if ( mp[ i ][ j ] ) {36                                 _cnt ++ ;37                                 DFS ( i , j ) ;38                         }39                 }40         }41         cout << _cnt << endl ; 42         return 0 ; 43 } 
View Code

 

2016-10-19 00:25:45

 

(完)

NOI 题库 1388