【Usaco DEC08 bronze】劣质的草

题目描述

贝茜像其它奶牛一样正在吃草,她正在思考她所在的地方。她注意
到她只得到了一个平于海平面的广泛大片牧场。只有海拔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行

输出

  • 行 1: 一个代表岛屿数的整数。

样例输入

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 (nx<n+1) and (ny>0) and (ny<m+1) then
                begin
                        if bz[nx,ny]=true then
                        begin
                                bz[nx,ny]:=false;
                                inc(p3);
                                a[p3].x:=nx;
                                a[p3].y:=ny;
                        end;
                end;
        end;
end;

begin
        readln(n,m);
        fillchar(bz,sizeof(bz),false);
        for i:=1 to n do
        begin
                for j:=1 to m do
                begin
                        read(s[i,j]);
                        if s[i,j]>0 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.

我活在这夜里。无论周围多么黑暗,我都要努力发光!我相信着,终有一天,我会在这深邃的夜里,造就一道最美的彩虹。
原文地址:https://www.cnblogs.com/RainbowCrown/p/11148437.html