P1506 拯救oibh总部
题目背景
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
var
s:longint;
a:array[0..500,0..500]of
longint;//0是防止回溯爆
c:char;
x,y,i,j,ans:longint;
procedure
try(x,y:integer);//用回溯来遍历
begin
if
a[x,y]=0
then exit;//如果被淹了,或走过就出去
a[x,y]:=0;//走过了
try(x,y+1);//往上走
try(x+1,y);//往右走
try(x,y-1);//往下走
try(x-1,y);//往左走
end;
begin
readln(x,y);
for
i:=1
to x do
begin
for
j:=1
to y
do
begin
read(c);
if
c='0'
then a[i,j]:=1;//目前1是空地,0是围墙(其他0是不在范围内的)
end;
readln;//换行输出
end;
for
i:=1
to x
do
begin
try(i,1);try(i,y);
end;//慢慢走吧~(在边界往里面找)
for
j:=1
to y
do begin
try(1,j);try(x,j);
end;
for
i:=2
to x-1
do//在外围(1、x、y)的要么是围墙要么被淹了(没墙挡)
for
j:=2
to y-1
do
if
a[i,j]=1
then
inc(ans);
writeln(ans);
end.