Краткий ответ: считаем все единичные грани решётки, затем убираем грани, которые оказались внутри одного кластера.
Пусть N = n*m*k — всего клеток. Если бы все клетки были отдельными, граней было бы 6N. Каждая пара соседних клеток склеивает две грани в одну, поэтому:
\[ \text{всего различных граней}=6N-E, \]
где E — число соседних пар клеток.
Затем вычитаем S — соседние пары, попавшие внутрь одного кластера:
\[ \text{ответ}=6nmk-E-S. \]
Для этой задачи:
\[ E=k\bigl(n(m-1)+m(n-1)\bigr)+nm(k-1) \]
— соседства внутри слоёв и между слоями.
\[ S=k\cdot \text{sameRG}+(k-1)\cdot \text{blue} \]
где:
sameRG— число пар соседних клетокR–RилиG–Gв одном слое;blue— число клетокBв одном слое.
Код:
import sys
def solve():
input = sys.stdin.readline
n, m, k = map(int, input().split())
grid = [input().strip() for _ in range(n)]
same_rg = 0
blue = 0
# Пары внутри одного слоя: вправо и вниз
for i in range(n):
row = grid[i]
blue += row.count('B')
for j in range(m - 1):
if row[j] == row[j + 1] and row[j] != 'B':
same_rg += 1
for i in range(n - 1):
for j in range(m):
if grid[i][j] == grid[i + 1][j] and grid[i][j] != 'B':
same_rg += 1
# Все соседние пары клеток
E = k * (n * (m - 1) + m * (n - 1)) + n * m * (k - 1)
# Соседства внутри одного кластера
S = k * same_rg + (k - 1) * blue
answer = 6 * n * m * k - E - S
print(answer)
if __name__ == "__main__":
solve()
Сложность: O(n*m) по времени, O(n*m) по памяти.
Проверка на примере 2 3 2 / RRG / RBG: получается 45. На 1 1 1 / R — 6, на 1 2 1 / BB — 11.
