假设我们有一个像这样的矩阵:
11111
12221
12321
12221
11111
该矩阵代表地形,每个像元代表地形的一部分。每个单元格中的数字表示根据地形的可燃性需要完全燃烧地形的时间(以分钟为单位,如果需要测量单位的话)。如果在任意给定位置(单元)开始起火,则该单元需要先完全燃烧,然后再传播到相邻单元(仅水平和垂直,而不是对角线)。因此,如果在中心位置起火,则火灾需要:
11111 11111 11111 11011 10001 00000
12221 3 m. 12221 2 m. 12021 1 m. 11011 1 m. 00000 1 m. 00000
12321 -----> 12021 -----> 10001 -----> 00000 -----> 00000 -----> 00000
12221 12221 12021 11011 00000 00000
11111 11111 11111 11011 10001 00000
说明:
- 射击始于[2,2](基于0),燃烧时间为3。
- 3分钟后,[1,2],[2,1],[2,3],[3,2]开始燃烧。
- 2分钟后,这些细胞结束燃烧,并且火焰传播到所有相邻的细胞,但是[0,2],[2,0],[2,4],[0,4]仅需要再燃烧1分钟,因此
- 1分钟后,这些细胞被燃烧,细胞繁殖到其相邻细胞。
- 再过一分钟后,第3步中其余的单元将结束燃烧,并且火会传播到它们相邻的单元(已经燃烧,因此什么也没有发生)。
- 最后一分钟过后,大火结束了整个地形的燃烧。
因此,这种情况的解决方案是8分钟。如果火灾始于最左上角的[0,0]单元:
11111 01111 00111 00011 00001 00000
12221 1 12221 1 02221 1 01221 1 00121 1 00011 1
12321 --> 12321 --> 12321 --> 02321 --> 01321 --> 00321 -->
12221 12221 12221 12221 02221 01221
11111 11111 11111 11111 11111 01111
00000 00000 00000 00000 00000
00000 1 00000 1 00000 1 00000 1 00000
00221 --> 00110 --> 00000 --> 00000 --> 00000
00221 00121 00020 00010 00000
00111 00011 00001 00000 00000
所以现在总时间是10分钟。
挑战
给定一个整数值的NxM矩阵(N> 0,M> 0),表示每个单元需要被完全消耗的时间,编写最短的程序/函数以该矩阵和一对整数作为起始位置,并返回/打印火灾完全消耗整个地形所需的时间。
- 每个单元的刻录时间为正(非零)。您不能假定单元格的最大值。
- 矩阵不必是正方形或对称的。
- 根据需要,矩阵可以是0索引或1索引。
- 该位置可以作为带有整数元组的单个参数给出,可以是任何其他合理格式的两个独立参数。
- 矩阵的尺寸不能指定为输入参数。
- 您无需输出每个中间步骤,只需输出所需的时间即可。但是如果以任何方式可视化这些步骤,我都不会抱怨。
另一个例子:
Fire starts at [1,1] (a '>' represents a minute):
4253 4253 4253 4153 4043 3033 2023 0001 0000
2213 > 2113 > 2013 > 1003 > 0002 > 0001 > 0000 >> 0000 > 0000
1211 1211 1211 1111 1001 0000 0000 0000 0000
Output: 9
这是代码高尔夫球,所以每种语言的最短程序可能会赢!
1
是M*N