zoukankan      html  css  js  c++  java
  • 【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.
    
    
    我活在这夜里。无论周围多么黑暗,我都要努力发光!我相信着,终有一天,我会在这深邃的夜里,造就一道最美的彩虹。
  • 相关阅读:
    单例设计模式
    MySQL数据类型
    MySQL创建、修改、删除数据库
    HTTP请求与响应
    netcore在CentOS7 下使用处理图片的问题
    SQL删除重复数据
    不同浏览器对cookie大小与个数的限制
    asp.net实现SQL2005的通知数据缓存
    MS SQL 设置自增长字段默认值
    MS SQL 批量操作
  • 原文地址:https://www.cnblogs.com/RainbowCrown/p/11148437.html
Copyright © 2011-2022 走看看