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

题目描述

      农夫约翰的农场可以表示成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.

你可能感兴趣的:(深搜)