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 12
W........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 } 

2016-10-19 00:25:45

(完)

时间: 2024-12-17 14:12:19

NOI 题库 1388的相关文章

[NOI题库]1.1题解

今年NOIP居然"各有两道题目从NOI题库中抽取并在原题基础上改动后使用",不好好刷题怎么行. 这是第一篇题解文章,因为题目太水直接上代码了. 1.1编程基础之输入输出 01 Hello, World! 根据题意直接输出"Hello, World!"即可. #include <iostream> using namespace std; int main() { cout<<"Hello, World!"<<e

NOI题库 1768最大子矩阵 题解

NOI题库 1768最大子矩阵  题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 9 2 -4 1 -1 8 这个子矩阵的大小是15. 输入   输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依

[NOI题库]1.3编程基础之算术表达式与顺序执行 题解(一)

01 A+B问题 经典的A+B Problem——各大题库上的首题.读入$a,b$,输出$a+b$. #include <iostream> using namespace std; int main() { int a,b; cin>>a>>b; cout<<a+b<<endl; return 0; } 01.cpp 02 计算(a+b)*c的值 读入$a,b,c$,输出$c(a+b)$. #include <iostream> u

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20

T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= m <= 100.接下来n行,每行m个整数,表示图像的每个像素点灰度.相邻两个整数之间用单个空格隔开,每个元素均在0~255之间. 输出 m行,每行n个整数,为顺时针旋转90度后的图像.相邻两个整数之间用单个空格隔开. 样例输入 3 3 1 2 3 4 5 6 7 8 9 样例输出 7 4 1 8 5

Openjudge NOI题库 ch0111/05 派

总时间限制: 1000ms 内存限制: 65536kB 描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成:可以是一整个派). 我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨.因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好.当然,我也要给自己留一块,而这一块也要和其他人的同样大小. 请问我们每个人拿到的派最

Openjudge NOI题库 ch0111/01 查找最近的元素

总时间限制: 1000ms 内存限制: 65536kB 描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n <= 100000.第二行包含n个整数,为非降序列各元素.所有元素的大小均在0-1,000,000,000之间.第三行包含一个整数m,为要询问的给定值个数.1 <= m <= 10000.接下来m行,每行一个整数,为要询问最接近元素的给定值.所有给定值的大小均在0-1,000,000,000之间. 输出 m行,每行一个

Openjudge NOI题库 ch0111/07 和为给定数

总时间限制: 1000ms 内存限制: 65536kB 描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入 共三行:第一行是整数n(0 < n <= 100,000),表示有n个整数.第二行是n个整数.整数的范围是在0到10^8之间.第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和. 输出 若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开.若有多个数对满足条件,选择数对中较小的数更小的.若找不到符合要求的数对,输出一行No

Openjudge NOI题库 ch0111/08 不重复地输出数

这题水得和二分点关系没有,这篇文纯粹凑数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n个数,从小到大将它们输出,重复的数只输出一次.保证不同的数不超过500个. 输入 第一行是一个整数n.1 <= n <= 100000.之后n行,每行一个整数.整数大小在int范围内. 输出 一行,从小到大不重复地输出这些数,相邻两个数之间用单个空格隔开. 样例输入 5 2 4 4 5 1 样例输出 1 2 4 5 1 #include <stdio.h> 2 #inclu

Openjudge NOI题库 ch0111/10 河中跳房子|NOIP2015 day2 stone

这题同时也是NOIP2015 D2T1 跳石头 stone 原题. 总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石.在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L). 在比赛过程中,奶牛轮流从起点