拯救OIBH总部
Time Limit:1000MS Memory Limit:65536K
Total Submit:259 Accepted:74
Description
背景 Background
OIBH总部突然被水淹没了!现在OIBH需要你的救援……
描述 Description
OIBH被突来的洪水淹没了>.<还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由"0"表示)有多少。
Input
输入格式 Input Format
第一行是两个数,x和y(x,y<=500)
第二行及以下是一个由*和0组成的x*y的图。
Output
输出没被水淹没的OIBH总部的“0”的数量。
Sample Input
样例输入1
4 5
00000
00*00
0*0*0
00*00
样例输入2
5 5
*****
*0*0*
**0**
*0*0*
*****
Sample Output
样例输出1 1 样例输出25
var f:array[1..4,1..2]of longint; a:array[0..500,0..500]of longint; b:array[0..500,0..500]of boolean; i,j,n,m,ans:longint; x:ansistring; function check(x,y:longint):boolean;//判断是否出格 begin if (x>0)and(x<=n)and(y>0)and(y<=m)and(a[x,y]<>1)and(b[x,y]=true) then exit(true); exit(false); end; procedure dfs(x,y:longint);//找到被淹的地方 var i:longint; begin b[x,y]:=false; for i:=1 to 4 do if check(x+f[i,1],y+f[i,2]) then dfs(x+f[i,1],y+f[i,2]); exit; end; begin readln(n,m); f[1,1]:=0; f[1,2]:=1;//方向表 f[2,1]:=1; f[2,2]:=0; f[3,1]:=0; f[3,2]:=-1; f[4,1]:=-1; f[4,2]:=0; for i:=1 to n do begin readln(x); for j:=1 to length(x) do if x[j]='*' then a[i,j]:=1; end; fillchar(b,sizeof(b),true); for i:=1 to m do//放水 begin if a[1,i]=0 then dfs(1,i); if a[n,i]=0 then dfs(n,i); end; for j:=1 to n do//放水 begin if a[j,1]=0 then dfs(j,1); if a[j,m]=0 then dfs(j,m); end; for i:=1 to n do for j:=1 to m do if (b[i,j])and(a[i,j]=0) then inc(ans); write(ans); end.