您的位置:首页 > 其它

jzoj 1898. 【2014.8.17NOIP普及组模拟】数池塘

2016-08-23 11:23 507 查看


1898. 【2014.8.17NOIP普及组模拟】数池塘(lkcount.pas/c/cpp) 

(File IO): input:lkcount.in output:lkcount.out

时间限制: 1000 ms  空间限制: 128000
KB  具体限制  
Goto ProblemSet


题目描述

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

      现给出约翰农场的图样,要求输出农场上的池塘数。

每次从没搜索过的点开始搜,把与之相邻的点标记,搜索的次数就是答案。

const
maxn=102;
dx:array[1..8] of longint=(-1,-1,0,1,1,1,0,-1);
dy:array[1..8] of longint=(0,1,1,1,0,-1,-1,-1);
var
a:array[0..maxn+1,0..maxn+1] of char;
f:array[0..maxn+1,0..maxn+1] of longint;
m,n,i,j,ans:longint;

procedure init;
var
i,j:longint;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(a[i,j]);
if a[i,j]='W'
then f[i,j]:=1;
end;
readln;
end;
end;

function check(x,y:longint):boolean;
begin
check:=true;
if (x<1) or (y<1) or (x>100) or (y>100) or (a[x,y]='.') or (f[x,y]<>1)
then exit(false);
end;

procedure dfs(x,y:longint);
var
i:longint;
begin
for i:=1 to 8 do
if check(x+dx[i],y+dy[i]) then
begin
f[x+dx[i],y+dy[i]]:=2;
dfs(x+dx[i],y+dy[i]);
end;
end;

begin
assign(input,'lkcount.in'); reset(input);
assign(output,'lkcount.out');rewrite(output);
init;
for i:=1 to n do
for j:=1 to m do
if (a[i,j]='W') and (f[i,j]=1)
then begin dfs(i,j); inc(ans); end;
writeln(ans);
close(input);close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: