zoukankan      html  css  js  c++  java
  • 【BZOJ】1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场(dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1619

    首先不得不说,,题目没看懂。。。。

    原来就是找一个下降的联通块。。。。

    排序后dfs标记即可。。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << #x << " = " << x << endl
    #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int N=705, dx[]={1,1,1,0,0,-1,-1,-1}, dy[]={1,0,-1,1,-1,1,0,-1};  
    int vis[N][N], h[N][N], ans, cnt, n, m;
    struct dat{ int x, y, h; } mp[N*N];
    bool cmp(const dat &a, const dat &b) { return a.h>b.h; }
    void dfs(int x, int y) {
    	vis[x][y]=1;
    	rep(i, 8) {
    		int fx=dx[i]+x, fy=dy[i]+y;
    		if(fx<1 || fy<1 || fx>n || fy>m || vis[fx][fy] || h[fx][fy]>h[x][y]) continue;
    		dfs(fx, fy);
    	}
    }
    int main() {
    	read(n); read(m);
    	for1(i, 1, n) for1(j, 1, m) read(h[i][j]), mp[++cnt].h=h[i][j], mp[cnt].x=i, mp[cnt].y=j;
    	sort(mp+1, mp+1+cnt, cmp);
    	for1(i, 1, cnt) {
    		int x=mp[i].x, y=mp[i].y;
    		if(!vis[x][y]) { dfs(x, y); ++ans; }
    	}
    	print(ans);
    	return 0;
    }
    

    Description

    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.

    农夫JOHN的农夫上有很多小山丘,他想要在那里布置一些保镖(……)去保卫他 的那些相当值钱的奶牛们。 他想知道如果在一座小山丘上布置一名保镖的话,他总共需要招聘多少名保镖。他现在手头有一个用数字矩阵来表示地形的地图。这个矩阵有N行(1 < N < = 100)和M列( 1 < M < = 70) 。矩阵中的每个元素都有一个值H_ij(0 < = H_ij < =10,000)来表示该地区的海拔高度。请你帮助他统计出地图上到底有多少个小山丘。 小山丘的定义是:若地图中一个元素所邻接的所有元素都比这个元素高度要小(或它邻接的是地图的边界),则该元素和其周围所有按照这样顺序排列的元素的集合 称为一个小山丘。这里邻接的意义是:若一个元素与另一个横坐标纵坐标和它的横纵坐标相差不超过1,则称这两个元素邻接。 问题名称:guard 输入格式: 第一行:两个由空格隔开的整数N和M 第二行到第N+1行:第I+1行描述了地图上的第I行,有M个由空格隔开的整数:H_ij. 输入样例:(guard.in): 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 输出格式: 第一行:小山丘的个数 输出样例:(guard.out): 3 输出样例解释: 地图上有三个小山丘:每个小山丘的山峰位置分别在左上角(高度为4),右上角(高度为1)和底部(高度为2)。

    Input

    * 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

    Output

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

    Sample Input

    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

    Sample Output

    3

    HINT

       三个山丘分别是:左上角的高度为4的方格,右上角的高度为1的方格,还有最后一行中高度为2的方格.

    Source

  • 相关阅读:
    .NET 世界中的远程脚本
    操作Active Directory C#
    三层体系结构总结(四)
    C#+Asp.net系列教程
    勿重复检测浏览器
    事件模块的演变(8)
    读jQuery之三(构建选择器)
    读jQuery之二(两种扩展)
    新API解析JSONAjax之七
    JS Queue LazyLoad 之二
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3958874.html
Copyright © 2011-2022 走看看