Введение
У сборщика налогов есть некоторые проблемы с управлением налогами его королевства: исторические записи сгорели в большом пожаре.
Он хочет выяснить, сколько возможного прошлого может быть с точки зрения того, откуда унаследованы текущие деньги. К счастью, его королевство очень просто.
Королевство может быть смоделировано двумерной логической матрицей, где l
представляет кого-то, кто унаследовал деньги, и O
кого-то, кто не имеет. Например:
l O l l
O O O l
l O l O
O O O l
(Это всегда будет прямоугольник)
В следующем поколении королевство меньше (волки сильны!).
Следующее поколение будет выглядеть так, наложенное на предыдущее поколение ( x
это заполнитель для потомка в следующем поколении)
l O l l
x x x
O O O l
x x x
l O l O
x x x
O O O l
Потомок будет смотреть на предков, которые непосредственно вокруг них (Таким образом, в левом верхнем углу x
будет видеть { l
, O
, O
, O
}, называется Unaligned прямоугольной окрестности )
Если только один предок унаследовал деньги, потомок унаследует деньги от них. Если более чем один предок унаследовал деньги, они ссорятся, и потомок в конечном итоге не наследует деньги. Если никто не унаследовал деньги, потомок не унаследует никаких денег.
(Более одного потомка могут наследовать от одного предка)
Итак, следующее поколение будет выглядеть так:
l l O
l l O
l l O
Вызов
вход
Текущее состояние генерации, как массив массивов любых двух различных значений, где все внутренние массивы имеют одинаковую длину.
Например, для приведенного выше примера это может быть:
[
[True, True, False],
[True, True, False],
[True, True, False]
]
Вывод
Целое число, представляющее количество уникальных предыдущих поколений, где следующее поколение является входным.
Можно предположить, что ответ всегда будет меньше 2 ^ 30 - 1. (или 1073741823).
Предыдущее поколение будет называться «прообразом», и эта задача будет заключаться в подсчете прообразов .
счет
Это быстрый код вызов, поэтому каждая заявка будет проверена на моем компьютере, и заявка, которая займет меньше всего времени, станет победителем.
Пример ввода и вывода
(Где 1
потомок, который унаследовал деньги, и 0
потомок, который не унаследовал деньги)
Входные данные:
[[1, 0, 1],
[0, 1, 0],
[1, 0, 1]]
Вывод:
4
Входные данные:
[[1, 0, 1, 0, 0, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 1, 0],
[1, 1, 1, 0, 0, 0, 1, 0],
[1, 0, 1, 0, 0, 0, 1, 0],
[1, 0, 1, 0, 0, 1, 1, 1]]
Вывод:
254
Входные данные:
[[1, 1, 0, 1, 0, 1, 0, 1, 1, 0],
[1, 1, 0, 0, 0, 0, 1, 1, 1, 0],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 1, 1, 0, 0]]
Вывод:
11567