[BZOJ] 1619: [Usaco 2008 Nov] 농장 을 지 키 는 목장 (dfs)
4536 단어 USACO
우선 어 쩔 수 없 이 제목 을 못 알 아 봤 어 요...
원래 떨 어 진 연결 블록 을 찾 는 거 야...
정렬 후 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. 입력 사례:: 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
Silver
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[USACO] 2021 December - BronzeN\le500,000 O(N \log N) O(N^2) O(N2)이라 포기. O(N) O(N) 풀이다. O(N^2) O(N2) 아닌가? O(N) O(N). O(NT) N \le 100,000 O(NT) O(N) O(...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.