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.