UVA – 12130 Summits

UVA – 12130 Summits

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Description

Download as PDF

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

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

4

The 2007 ACM Northwestern European Programming Contest

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

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

#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.net/117669.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ssl协议及开源实现openssl

    ssl协议及开源实现opensslssl协议SSL:(SecureSocketLayer)安全套接层,ssl是一套安全协议,被应用层调用,当http调用ssl协议时被称为https,当ftp调用ssl协议时被称为sftp。lls是一个协议的集合,其中包括:Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换ChangeCipherSpec协议:一条消息表明握手协议已

    2022年5月11日
    66
  • Leetcode 611 javascript Valid Triangle Number

    Leetcode 611 javascript Valid Triangle Number

    2021年6月16日
    94
  • 数人云|优势+工具+实践=DevOps&Docker的企业级落地

    数人云|优势+工具+实践=DevOps&Docker的企业级落地

    2022年3月5日
    40
  • Intellij IDEA优化配置(1)——Darcula主题的选择以及字体和颜色配置(基于Intellij IDEA 2019.1)

    Intellij IDEA优化配置(1)——Darcula主题的选择以及字体和颜色配置(基于Intellij IDEA 2019.1)Darcula主题的选择以及字体和颜色配置IntellijIDEA优化配置一.主题选择二.主题导入合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程…

    2022年6月27日
    226
  • 深入浅出JVM调优,看完你就懂

    深入浅出JVM调优,看完你就懂深入浅出JVM调优基本概念:JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。下图文JVM的内存模型从图中我们可以看到,1、JVM实质上分为三大块,年轻代(YoungGen),年老代(OldMemory…

    2022年6月1日
    35
  • translate函数用法_fork函数在循环体中

    translate函数用法_fork函数在循环体中TranslateMessage函数函数功能描述:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。.函数原型:   BOOLTranslateMessage( CONSTMSG*lpMsg);.参数:   lpMsg       指向一个含有用GetMessage或PeekMe

    2025年11月5日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号