首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >UVA – 12130 Summits

UVA – 12130 Summits

作者头像
全栈程序员站长
发布2022-07-05 20:15:39
发布2022-07-05 20:15:39
2350
举报

大家好,又见面了,我是全栈君

Description

Problem G – Summits

Time limit: 8 seconds

You recently started working for the largest map drawing company in theNetherlands. Part of your job is to determine what the summits in aparticular landscape are. Unfortunately, it is not so easy to determinewhich points are summits and which are not, because we do not want tocall a small hump a summit. For example look at the landscape given bythe sample input.

We call the points of height 3 summits, since there are no higherpoints. But although the points of height 2, which are to theleft of the summit of height 3, are all higher than or equal totheir immediate neighbours, we do notwant to call them summits, because we can reach a higher point fromthem without going to low (the summits of height 3). In contrast,we do want to call the area of height 2 on the right a summit, sinceif we would want to walk to the summit of height 3, we first have todescend to a point with height 0.

After the above example, we introduce the concept of a d-summit. Apoint, with height h, is a d-summit if and only if it isimpossible to reach a higher point without going through an area withheight smaller than or equal to hd.

The problem is, given a rectangular grid of integer heights and aninteger d, to find the number of d-summits.

Input

On the first line one positive number: the number of testcases, atmost 100. After that per testcase:

  • One line with three integers 1 ≤ h ≤ 500, 1 &le w ≤ 500 and 1 ≤ d ≤ 1000000000. h and w are the dimensions of the map. d is as defined in the text.
  • h lines with w integers, where the xth integer on the yth line denotes the height 0 ≤ h ≤ 1000000000 of the point (x, y).

Output

Per testcase:

  • One line with the number of summits.

Sample Input

代码语言:javascript
复制
1
6 10 2
0 0 0 0 0 0 0 0 0 0
0 1 2 1 1 1 1 0 1 0
0 2 1 2 1 3 1 0 0 0
0 1 2 1 3 3 1 1 0 0
0 2 1 2 1 1 1 0 2 0
0 0 0 0 0 0 0 0 0 0

Sample Output

代码语言:javascript
复制
4

The 2007 ACM Northwestern European Programming Contest

题意:多么费解的题目啊,找顶点,假设一个点是最高的话那么就是顶点。假设不是的话,可是它到比它到的点的路径中假设有<=h-d(h为该点的高度)那么就不能去,那么它就是顶点

思路:首先找个性质:假设A->B,C->B,假设HA>HC,由于HA-d>HC-d,那么C->A,所以我们先按高度排序,然后逐个BFS,假设它的周围能找到跟它一样高的点。那么这些点都是顶点。假设遇到已经被较高找到的点。那么它就也能够到那个较高的点。那么它就不是顶点

代码语言:javascript
复制
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 510;

struct node {
	int x, y, h;
	node(int _x = 0, int _y = 0, int _h = 0) {
		x = _x;
		y = _y;
		h = _h;
	}
} arr[MAXN*MAXN];
int map[MAXN][MAXN];
int vis[MAXN][MAXN];
int n, m, d;
int cnt;
int dx[4]={1, -1, 0, 0};
int dy[4]={0, 0, 1, -1};
queue<node> q;

int cmp(node a, node b) {
	return a.h > b.h;
}

void cal() {
	memset(vis, -1, sizeof(vis));
	int ans = 0;
	while (!q.empty())
		q.pop();
	for (int i = 0; i < cnt; i++) {
		node cur = arr[i];
		if (vis[cur.x][cur.y] != -1)
			continue;
		int flag = 1;
		int bound = cur.h - d;
		int top = cur.h;
		q.push(cur);
		int tot = 1;
		while (!q.empty()) {
			cur = q.front();
			q.pop();
			vis[cur.x][cur.y] = top;
			for (int i = 0; i < 4; i++) {
				int nx = cur.x + dx[i];
				int ny = cur.y + dy[i];
				if (nx < 1 || ny < 1 || nx > n || ny > m)
					continue;
				if (map[nx][ny] <= bound)
					continue;
				if (vis[nx][ny] != -1) {
					if (vis[nx][ny] != top)
						flag = 0;
					continue;
				}
				node tmp;
				tmp.x = nx, tmp.y = ny, tmp.h = map[nx][ny];
				vis[nx][ny] = top;
				if (tmp.h == top) 
					tot++;
				q.push(tmp);
			}
		}
		if (flag) 
			ans += tot;
	}
	printf("%d\n", ans);
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d%d", &n, &m, &d);
		cnt = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++) {
				scanf("%d", &map[i][j]);
				arr[cnt++] = node(i, j, map[i][j]);
			}
		sort(arr, arr+cnt, cmp);
		cal();
	}
	return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117669.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Problem G – Summits
    • Time limit: 8 seconds
    • Input
    • Output
    • Sample Input
    • Sample Output
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档