题目背景
oibh总部突然被水淹没了!现在需要你的救援……
题目描述
oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去的……现在给出oibh的围墙建设图,问oibh总部没被淹到的重要区域(由”0”表示)有多少。
输入输出格式
输入格式:
第一行是两个数,x和y(x,y<=500)
第二行及以下是一个由*和0组成的x*y的图。
输出格式:
输出没被水淹没的oibh总部的“0”的数量。
输入输出样例
输入样例#1:
样例输入1
4 5
00000
00*00
0*0*0
00*00
输出样例#1:
样例输出1
1
深搜:
1.搜每个0它所在的那部分(所有相邻的0当成一部分)。
2.如果某个零的某个方向一直找到越界,也没有围墙堵住,则代表这一整块0不是封闭的。
(布尔型判断是否封闭)
3.搜的时候累加0的个数。
4.将整块0区域遍历完之后,如果密封就加上这块0区域的0的个数。
const
dx:array[1..4] of longint=(-1,0,1,0);
dy:array[1..4] of longint=(0,1,0,-1);
var
a:Array [0..501,0..501] of longint;
b:array [0..501,0..501] of boolean;
i,j,n,m,ans,now:longint;
c:char;
flag:boolean;
function check(aa,bb:longint):boolean;
begin
if (aa<1) or (aa>n) or (bb<1) or (bb>m) then exit(false);
exit(true);
end;
procedure dfs(x,y:longint);
var
i:longint;
begin
if a[x,y]=1 then exit;
if check(x,y)=false then
begin
flag:=false;
exit;
end;
inc(now);
b[x,y]:=false;
for i:=1 to 4 do
if b[x+dx[i],y+dy[i]] then dfs(x+dx[i],y+dy[i]);
end;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(c);
if c='*' then a[i,j]:=1;
end;
readln;
end;
fillchar(b,sizeof(b),true);
for i:=1 to n do
for j:=1 to m do
if a[i,j]=0 then
if b[i,j] then
begin
now:=0;
flag:=true;
b[i,j]:=false;
dfs(i,j);
if flag then ans:=ans+now;
end;
writeln(ans);
end.