这是一道典型的广搜裸题,不多说,上代码:
const z:array[1..4,1..2]of longint=((-1,0),(1,0),(0,-1),(0,1));
var i,j,k,t,h,q:longint;
a:array[-20..1000,-20..1000]of char;
x,y,s:array[-2..1000]of longint;
b:array[-20..1000,-20..1000]of boolean;
m,n:longint;
begin
read(m,n);
readln;
for i:=1 to m do
for j:=1 to n do b[i,j]:=true;
for i:=1 to m do
begin
for j:=1 to n do begin read(a[i,j]); if a[i,j]='0' then b[i,j]:=false; end;
readln;
end;
for i:=1 to m do//每个格子bfs
for j:=1 to n do
begin
if b[i,j] then
begin
t:=1;
h:=1;
x:=s;
y:=s;
x[1]:=i;
y[1]:=j;
inc(q);
repeat
for k:=1 to 4 do
if b[x[t]+z[k,1],y[t]+z[k,2]] and (a[x[t]+z[k,1],y[t]+z[k,2]]<>'0') then//典型广搜
begin
inc(h);
b[x[t]+z[k,1],y[t]+z[k,2]]:=false;
x[h]:=x[t]+z[k,1];
y[h]:=y[t]+z[k,2];
end;
inc(t);
until t>h;
end;
end;
write(q);//输出即可
end.
这是一道刚学bfs时改写的,没什么难度,主要要打熟模板。