题目描述
贝茜像其它奶牛一样正在吃草,她正在思考她所在的地方。她注意
到她只得到了一个平于海平面的广泛大片牧场。只有海拔1米或者更
高更硬的草不那么美味。草随着海拔的增加越发难吃。
继续咀嚼,她意识到,这没有食欲的食物长成两侧的丘陵,形成了青
翠美味丰富草地海洋中的一系列劣质草小岛 。
贝茜穿上她的实验服,决心测定她的牧场有多少劣草小岛。她画出一
张画有被分成R (1 < R <= 1,000) 行、C (1 < C<= 1,000)列的1米x1米
小格子的地图。她为每个小格子测量了海拔高度,并四舍五入到
非负整数。她饥饿地把所有美味草标的海拔标记成0。
她着手统计小岛。任何水平、垂直、斜向相邻的两个有劣草的格子将
被认为在同一个岛中。
在每一张她提供的地图中有多少劣草岛屿呢?
程序名称: badgras
输入
行 1: 两个用空格隔开的整数: R 和 C
行 2…R+1: 行 i+1 用C个看空格隔开的整数表示地图中的i行
输出
样例输入
8 7
4 3 2 2 1 0 1
3 3 3 2 1 0 1
2 2 2 2 1 0 0
2 1 1 1 1 0 0
1 1 0 0 0 1 0
0 0 0 1 1 1 0
0 1 2 2 1 1 0
0 1 1 1 2 1 0
样例输出
2
题解:
明显的一道搜索题。dfs、bfs都可以,此题与一题很是相似:“细胞”,大家也可以去看看。
本题可以去找一个>0的格子,然后就从这个格子向八个方向拓展,每次找到一个>0的格子就记录且改成0。然后就可以过去。若是数据还要大一些,bfs可以用哈希表、滚动数组、双向bfs来优化。
此乃bfs:
标程:
type
new=record
x:longint;
y:longint;
end;
var
i,j,k,l,n,m,p1,p2,p3,sp:longint;
a:array[1..1000000] of new;
s:array[1..1000,1..1000] of longint;
bz:array[1..1000,1..1000] of boolean;
fx:array[1..8,1..2] of longint=((-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1));
procedure gc(dep:longint);
var
i,j,k,l,nx,ny,ans:longint;
begin
for i:=1 to 8 do
begin
nx:=a[dep].x+fx[i,1];
ny:=a[dep].y+fx[i,2];
if (nx>0) and (nx0) and (ny0 then
begin
bz[i,j]:=true;
end;
end;
end;
p1:=1;p2:=1;p3:=1;
for i:=1 to n do
begin
for j:=1 to m do
begin
if bz[i,j]=true then
begin
a[p3].x:=i;a[p3].y:=j;
bz[i,j]:=false;
inc(sp);
repeat
for k:=p1 to p2 do
begin
gc(k);
end;
p1:=p2+1;
p2:=p3;
until p1>p2;
fillchar(a,sizeof(a),0);
p1:=1;
p2:=1;
p3:=1;
end;
end;
end;
writeln(sp);
end.