18. Исполнитель Робот: #297243
Квадрат разлинован на $N\times N$ клеток, где $1<N<30$. Робот может выполнять команды вправо и вниз. Между соседними клетками могут находиться стены, через которые пройти нельзя.
В каждой клетке лежит монета достоинством от $1$ до $100$. Посетив клетку, Робот забирает монету с собой, включая начальную и конечную клетки маршрута.
Конечной считается «угловая» клетка, у которой справа и снизу находятся стены. Таких клеток может быть несколько. Требуется определить максимальную и минимальную суммы среди всех возможных маршрутов из левой верхней клетки в одну из конечных. В ответе сначала указывается максимальная сумма, затем минимальная.
Пример входных данных:

Исходная таблица занимает диапазон $A1:T20$, поэтому $N=20$.
Вертикальные стены расположены справа от $B3:B6$, $I3$, $M4:M10$, $K8:K14$, $S8:S14$, $C14:C17$, $Q17:Q20$.
Горизонтальные стены расположены снизу от $F2:I2$, $N3:Q3$, $C6:G6$, $H14:K14$, $Q14:S14$, $M16:Q16$, $D17:H17$.
Расчётную таблицу разместим справа от исходной, начиная с ячейки $V1$.
В $V1$ запишем: $=A1$
В $W1$: $=V1+B1$ и скопируем вправо до $AO1$.
В $V2$: $=V1+A2$ и скопируем вниз до $V20$.
Для поиска максимальной суммы в $W2$ запишем: $=B2+МАКС(W1;V2)$ и скопируем в диапазон $W2:AO20$.
Для первых клеток:
$V1=99$,
$W1=99+72=171$,
$V2=99+83=182$,
$W2=78+\max(171;182)=260$.
Около стен оставляем только разрешённое направление движения. Например, справа от стены $B3:B6$ в клетки $C3:C6$ можно попасть только сверху, поэтому в $X3$ запишем: $=C3+X2$ и скопируем до $X6$.
Под стеной $F2:I2$ в клетки $F3:I3$ можно попасть только слева. В $AA3$ запишем: $=F3+Z3$ и скопируем вправо до $AD3$.
Аналогично учитываем остальные стены. Диапазон $N4:Q10$ недостижим, поэтому для поиска максимума соответствующему диапазону $AI4:AL10$ можно присвоить значение $-10^9$.
Конечными клетками являются $K14$, $S14$, $Q20$ и $T20$. Им соответствуют ячейки $AF14$, $AN14$, $AL20$, $AO20$.
Максимальные суммы в них:
$AF14=1804$,
$AN14=2144$,
$AL20=2468$,
$AO20=2287$.
Следовательно, $\max(1804;2144;2468;2287)=2468$.
Для поиска минимальной суммы в обычных клетках используем: $=B2+МИН(W1;V2)$
Для первых клеток: $W2=78+\min(171;182)=249$.
В недостижимый диапазон $AI4:AL10$ записываем $10^9$. Формулы около стен остаются такими же.
Минимальные суммы в конечных клетках: $AF14=938$, $AN14=1116$, $AL20=1297$, $AO20=1281$.
Следовательно, $\min(938;1116;1297;1281)=938$.
Ответ: $2468$ $938$.
Код на Python
Если сохранить таблицу в формате CSV с именем 18-25.csv, результат можно проверить программой:
s = tuple(
tuple(map(int, row.split(';')))
for row in open('18-25.csv').read().splitlines()
)
N = len(s)
right = set()
for r1, r2, c in [
(3, 6, 2), (3, 3, 9), (4, 10, 13),
(8, 14, 11), (8, 14, 19),
(14, 17, 3), (17, 20, 17)
]:
for r in range(r1 - 1, r2):
right.add((r, c - 1))
down = set()
for r, c1, c2 in [
(2, 6, 9), (3, 14, 17), (6, 3, 7),
(14, 8, 11), (14, 17, 19),
(16, 13, 17), (17, 4, 8)
]:
for c in range(c1 - 1, c2):
down.add((r - 1, c))
mn = [[10 ** 9] * N for _ in range(N)]
mx = [[-10 ** 9] * N for _ in range(N)]
mn[0][0] = mx[0][0] = s[0][0]
for i in range(N):
for j in range(N):
if i == 0 and j == 0:
continue
a, b = [], []
if j > 0 and (i, j - 1) not in right:
if mn[i][j - 1] < 10 ** 9:
a.append(mn[i][j - 1])
b.append(mx[i][j - 1])
if i > 0 and (i - 1, j) not in down:
if mn[i - 1][j] < 10 ** 9:
a.append(mn[i - 1][j])
b.append(mx[i - 1][j])
if a:
mn[i][j] = s[i][j] + min(a)
mx[i][j] = s[i][j] + max(b)
ends = []
for i in range(N):
for j in range(N):
wall_right = j == N - 1 or (i, j) in right
wall_down = i == N - 1 or (i, j) in down
if wall_right and wall_down and mn[i][j] < 10 ** 9:
ends.append((mn[i][j], mx[i][j]))
print(max(x[1] for x in ends), min(x[0] for x in ends))
Программа выводит: $2468$ $938$.