QOJ.ac

QOJ

Time Limit: 0 s Memory Limit: 1024 MB Total points: 30

#5876. 亚特兰蒂斯之雨

Statistics

亚特兰蒂斯岛上降下大雨,雨水将侵蚀所有的陆地直至其消失。为了组织撤离,你需要计算这一过程需要多久。

你拥有一张亚特兰蒂斯地图。地图是一个方格网,每个方格包含该处陆地海拔高度(以米为单位)。地图之外的所有方格高度均为 0;所有高度为 0 的方格为水域,所有高度大于 0 的方格为陆地。不存在高度小于 0 的方格。

如果源方格和目标方格共享一条边,且目标方格的水位低于或等于源方格的水位,则水可以从源方格流向目标方格。

降雨非常迅速,这意味着如果一个方格内的雨水无处可流,该方格内的水就会积聚,直到有可以流出的方格为止。地图之外的方格可以容纳任意流量。例如,以下地图:

5 9 9 9 9 9
0 8 9 0 2 5
3 9 9 9 9 9

将迅速积满水。我们将每个方格的水位高度加上陆地高度称为水位。它将变为:

5 9 9 9 9 9
0 8 9 5 5 5
3 9 9 9 9 9

注意,陆地中间的 0 虽然是水,但由于它没有连接到地图外部,所以只是积聚了水。而陆地边缘的 0 连接到了地图外部,因此 8 处的水可以通过它流向外部。

水流的方向由水位决定。如果一个特定的源方格有多个可能的流向方格,水将流向水位最低的方格(如你所见,平局并不重要)。

现在侵蚀开始了。每天,一个方格都会被侵蚀——其高度会降低——这取决于水如何从该方格流出。如果水从 S 流向 T,则 S 的高度降低 min(WaterLevel(S) - WaterLevel(T), M)。所有侵蚀都在一天结束时同时发生。例如,当 M=5 时,上述地图将侵蚀为:

0 4 4 4 4 4
0 3 5 0 2 0
0 4 4 4 4 4

经过一天的侵蚀后,多余的水会流走:水位高于邻居水位的方格会流失水分,直到它们达到相同的高度。水也会像第一天那样积聚。第一天过后,该地图的水位将变为:

0 4 4 4 4 4
0 3 5 2 2 0
0 4 4 4 4 4

再经过一天的侵蚀,地图将变为:

0 0 0 0 0 0
0 0 2 0 0 0
0 0 0 0 0 0

……亚特兰蒂斯人需要赶紧逃离。你的任务是确定所有高度侵蚀到 0 需要多少天。

输入格式

输入的第一行包含测试用例的数量 T。接下来是 T 个测试用例。每个测试用例的第一行包含三个空格分隔的整数:HWM。前两个表示地图的大小,第三个是如上所述的方格每天最大侵蚀量。接下来的 H 行,每行包含 W 个空格分隔的整数。第 j 行的第 i 个整数表示位于 (i, j) 的方格高度。

输出格式

对于每个测试用例,输出一行 "Case #x: y",其中 x 是用例编号(从 1 开始),y 是岛屿完全侵蚀所需的天数。

数据范围

1 ≤ T ≤ 40。

内存限制:1GB。

小数据集(测试集 1 - 可见;7 分)

1 ≤ H, W ≤ 10。

1 ≤ M ≤ 100。

0 ≤ 所有高度 ≤ 100。

时间限制:6 秒。

大数据集(测试集 2 - 隐藏;23 分)

1 ≤ H, W ≤ 20。

1 ≤ M ≤ 1015

0 ≤ 所有高度 ≤ 1015

时间限制:12 秒。

样例

输入格式 1

2
3 6 5
5 9 9 9 9 9
0 8 9 0 2 5
3 9 9 9 9 9
3 6 3
3 8 10 11 10 8
7 5 2 12 8 8
6 9 11 9 8 4

输出格式 1

Case #1: 3
Case #2: 5

说明

在第二个样例中,水位看起来如下:

3 8 10 11 10 8

7 7 7 12 8 8

6 9 11 9 8 4

第一天后,岛屿看起来如下:

0 5 7 8 7 5

4 5 2 9 8 5

3 6 8 6 5 1

第二天后:

0 2 4 5 4 2

1 4 2 6 5 2

0 3 5 3 2 0

第三天后:

0 0 1 2 1 0

0 1 2 3 2 0

0 0 2 0 0 0

第四天后,亚特兰蒂斯人的处境变得绝望:

0 0 0 0 0 0

0 0 1 0 0 0

0 0 0 0 0 0

最后,在第五天,最后一个方格被侵蚀殆尽。亚特兰蒂斯坚持了五天;他们大概不应该用红糖建造他们的城市。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.