亚特兰蒂斯岛上降下大雨,雨水将侵蚀所有的陆地直至其消失。为了组织撤离,你需要计算这一过程需要多久。
你拥有一张亚特兰蒂斯地图。地图是一个方格网,每个方格包含该处陆地海拔高度(以米为单位)。地图之外的所有方格高度均为 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 个测试用例。每个测试用例的第一行包含三个空格分隔的整数:H、W 和 M。前两个表示地图的大小,第三个是如上所述的方格每天最大侵蚀量。接下来的 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
最后,在第五天,最后一个方格被侵蚀殆尽。亚特兰蒂斯坚持了五天;他们大概不应该用红糖建造他们的城市。