После развертывания исходный лист распадется на некоторое количество
связных частей, т.е. таких множеств клеток, что из любой клетки одного
множества можно пройти до любой другой, переходя каждый раз на соседнюю
по вертикали или горизонтали клетку. Напишите программу, вычисляющую
число частей, на которые распадется лист.
Входные данные
Первая строка входного файла содержит целое число N (4 ≤ N ≤ 500). В
следующих 8 строках записана матрица 8 × 8 из нулей и единиц, разделенных
пробелом. Единицами отмечены клетки, выкалываемые дыроколом из
сложенного листа 8 × 8.
Выходные данные
Вывести в выходной файл искомое число частей.
Пример входного файла
4
0 1 0 0 0 0 1 0
1 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 0
0 0 0 1 0 1 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
Пример выходного файла
11
Рассмотрим, например, разгибание относительно нижней стороны. Легко заметить, что связная область типа b3b2b11 перейдет в связную область типа b3b2b1b1 (действительно, будет ли она прилегать к нижнему краю после разгибания зависит от того, прилегала ли она к верхнему до разгибания). Связная область типа b3b2b10 после разгибания распадется на две. Одна из них будет иметь тот же тип b3b2b10, а другая – тип b3b20b1. Аналогично анализируется разгибание листа относительно правой стороны.
Для решения задачи проделываем 2N разгибаний, обратных произведенным при складывании листа сгибаниям. При этом на каждом шаге пересчитываем количество связных областей каждого из типов.