SSL 2324
洛谷 P1451 求细胞数量
题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:阵列
0234500067
1034560500
2045600671
0000000089
有4个细胞。
P.S. 有人看不懂,其实就是并在一起的方阵算一个细胞。
题目分析
和找石油差不多的题目,不过用的是广搜。
首先,读入时可以将非零数标记为True。
然后用两重循环,每次找到为True的就进入BFS并增加细胞数量。
BFS在这里的作用,将整个细胞标记为False,然后在接下来的循环中就不会再找这个细胞了。
const
dx:array[1..4]of longint=(1,-1,0,0);
dy:array[1..4]of longint=(0,0,1,-1);
var
n,m,x,y:longint;
a:array[1..100,1..100]of boolean;
f:array[1..10000]of longint;
s:array[1..10000,1..2]of longint;
procedure init;
var
i,j:longint;
c:char;
begin
readln(m,n);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(c);
if c<>'0' then a[i,j]:=true
else a[i,j]:=false;
end;
readln;
end;
end;
function ping(x,y:longint):boolean;
begin
if (not (x in[1..m]))or(not(y in[1..n])) then exit(false);
if not a[x,y] then exit(false);
exit(true);
end;
procedure bfs;
var
h,t,i:longint;
begin
h:=0;t:=1;
s[1,1]:=x;s[1,2]:=y;
repeat
inc(h);
for i:=1 to 4 do
if ping(s[h,1]+dx[i],s[h,2]+dy[i]) then
begin
inc(t);
f[t]:=h;
s[t,1]:=s[h,1]+dx[i];
s[t,2]:=s[h,2]+dy[i];
a[s[t,1],s[t,2]]:=false;
end;
until h=t;
end;
procedure main;
var
s:longint;
begin
s:=0;
for x:=1 to m do
for y:=1 to n do
if a[x,y] then begin inc(s);bfs; end;
writeln(s);
end;
begin
init;
main;
end.