Предположим, у нас есть такая матрица:
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 минуту эти клетки сжигаются, и эта клетка распространяется на соседние клетки.
- Еще через 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