题目背景
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
样例输入2
5 5
*****
*0*0*
**0**
*0*0*
*****
输出样例#1:
样例输出1
1
样例输出2
5
题解:
这题用深度搜索,然后判断"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.
拯救oibh总部-洛谷 1506
最新推荐文章于 2024-07-29 19:51:36 发布