USACO 2008 Nov Silver 2.Guarding the Farm

2593: USACO 2008 Nov Silver 2.Guarding the Farm

题目描述

The farm has many hills upon which Farmer John would like to place guards to ensure the safety of his valuable milk-cows.

He wonders how many guards he will need if he wishes to put one on top of each hill. He has a map supplied as a matrix of integers; the matrix has N (1 < N <= 700) rows and M (1 < M <= 700) columns. Each member of the matrix is an altitude H_ij (0 <= H_ij <= 10,000). Help him determine the number of hilltops on the map.

A hilltop is one or more adjacent matrix elements of the same value surrounded exclusively by either the edge of the map or elements with a lower (smaller) altitude. Two different elements are adjacent if the magnitude of difference in their X coordinates is no greater than 1 and the magnitude of differences in their Y coordinates is also no greater than 1.

农场里有许多山丘,在山丘上约翰要设置哨岗来保卫他的价值连城的奶牛.

约翰不知道有多少山丘,也就不知道要设置多少哨岗.他有一张地图,用整数矩阵的方式描 述了农场N(1 <= N<=700)行M(1 < M<=700)列块土地的海拔高度好 H_ij (0 <= H_ij <= 10,000).请帮他 计算山丘的数量.

一个山丘是指某一个方格,与之相邻的方格的海拔高度均严格小于它.当然,与它相邻的方 格可以是上下左右的那四个,也可以是对角线上相邻的四个.

输入输出格式

输入格式:

* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: Line i+1 describes row i of the matrix with M

space-separated integers: H_ij

输出格式:

* Line 1: A single integer that specifies the number of hilltops

思路:地图题,不解释,上代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
    int x,y,h;
}a[500000];
int mx[8]={0,0,1,1,1,-1,-1,-1};
int my[8]={-1,1,-1,0,1,-1,0,1};
bool cmp(const node &a,const node &b)
{
    return a.h==b.h?a.x<b.x:a.h>b.h;
}
bool vis[701][701];
int cnt;
int n,m;
int map[701][701];
queue<node>q;
void bfs(int now)
{
    q.push((node){a[now].x,a[now].y,0});
    vis[a[now].x][a[now].y]=1;
    while(!q.empty())
    {
        node u=q.front();
        q.pop();
        int xx=u.x,yy=u.y,hh=map[xx][yy];
        for(int i=0;i<8;i++)
        {
            int tx=xx+mx[i],ty=yy+my[i];
            if(tx<=0||ty<=0||tx>n||ty>m)
                continue;
            if(hh>=map[tx][ty]&&!vis[tx][ty])
            {
                vis[tx][ty]=1;
                q.push((node){tx,ty,0});
            }
        }
    }
}
int main()
{
     
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&map[i][j]);
            a[++cnt].x=i,a[cnt].y=j,a[cnt].h=map[i][j];
        }
    }
    int ans=0;
    sort(a+1,a+cnt+1,cmp);
    for(int i=1;i<=cnt;i++)
    {
        if(!vis[a[i].x][a[i].y]&&a[i].h!=0)
        {
            ans++;
            //printf("%d %d\n",a[i].x,a[i].y);
            bfs(i);
        }
    }
    printf("%d",ans);
}

 原文链接

猜你喜欢

转载自www.cnblogs.com/Tobichi/p/9056578.html
今日推荐