SSL P1454 找石油

Description

自从上次使用了你做的软件,YJQ公司被我们成功打败。他们只好另寻出路,去挖石油。为了完全打败YJQ公司,我们要把他的所有行动都封锁掉。现在我,LKI,又找到了你,编一个程序求出一块地中有多少块石油。

Input

第一行是这块地的长度与宽度N与M,(1<=N,M<=1000),下面N行M列的N*M个字符不是“@”,就是“#”。“@”代表着这是石油,“#”代表着这不是石油。若两块石油相邻,则认为他们是一块石油。

Output

只有一行,石油的个数。

Sample Input

4 3
@#@
@#@
##@
@@#
Sample Output

3

dfs:
1.找到一个任意一个石油@。
2.与这个石油间接或直接相连的石油遍历,并赋值为“#”。
3.答案累加1。

const
  maxn=1000;
  dx:array [1..4] of integer=(0,0,1,-1);
  dy:array [1..4] of integer=(1,-1,0,0);
var
  a:array [0..maxn+1,0..maxn+1] of char;
  m,n:integer;
  i,j,s:longint;
  o:char;

procedure dfs(x,y:integer);
 var
  i:integer;
begin
   if a[x,y]='#' then exit;
   if (x>0) and (x<=m) and (y>0) and (y<=n) then
      begin
         a[x,y]:='#';
         for i:=1 to 4 do
             if a[x+dx[i],y+dy[i]]='@' then dfs(x+dx[i],y+dy[i]);
      end;
end;

begin
   readln(m,n);
    for i:=1 to m do
        begin
           for j:=1 to n do read(a[i,j]);
           readln;
        end;
    s:=0;
        for i:=1 to m do
            for j:=1 to n do
               if a[i,j]='@' then
                  begin
                    inc(s);
                    dfs(i,j);
                  end;
  writeln(s);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值