Теоретический материал
Задача о симпатичных узорах
Рассмотрим еще одну задачу с прямоугольной таблицей.
Дана таблица n×m, каждая клетка которой может быть окрашена в один из двух цветов: белый или черный. Симпатичным узором называется такая раскраска, при которой не существует квадрата 2×2, в котором все клетки одного цвета. Даны n и m. Требуется найти количество симпатичных узоров для соответствующей таблицы.
![]() |
Будем считать профилем для bi битовую карту i-го столбца (единицей будет кодировать черную клетку, а нулем -- белую). При этом узор, заключенный между нулевой и i-й базовыми линиями, является симпатичным.
Из профиля p1 для bi можно получить p2 для bi + 1, если и только если можно так закрасить (i + 1)-й столбец, что его битовая карта будет соответствовать p2, и между bi - 1 и bi + 1 не будет полностью черных либо белых квадратиков 2×2.
![]() |
Сколькими же способами из одного профиля можно получить другой? Понятно,
что закрасить нужным образом либо можно, либо нельзя (так как раскрашивать можно
единственным образом -- так, как закодировано в p2). Таким образом,
d[p1, p2] {0, 1}.
Вычислять D можно либо проверяя на "совместимость" (то есть наличие одноцветных квадратов 2×2) все пары профилей, либо генерируя все допустимые профили для данного. Ниже приведен код, реализующий первую идею:
// можно ли из p1 получить p2 function can(p1, p2 : integer) : boolean; var i : integer; b : arrray[1..4] of byte; begin for i := 0 to n - 2 do begin b[1] := bit(p1, i); b[2] := bit(p1, i + 1); b[3] := bit(p2, i); b[4] := bit(p2, i + 1); if (b[1] = 1) and (b[2] = 1) and (b[3] = 1) and (b[4] = 1) then begin // квадрат в строках i и i + 1 черный can := false; exit; end; if (b[1] = 0) and (b[2] = 0) and (b[3] = 0) and (b[4] = 0) then begin // квадрат в строках i и i + 1 белый can := false; exit; end; end; can := true; end; procedure determine_D; var p1, p2 : integer; begin for p1 := 0 to (1 shl n) - 1 do for p2 := 0 to (1 shl n) - 1 do if can(p1, p2) then d[p1, p2] :=1 else d[p1, p2] := 0; end;
После того, как вычислена матрица D, остается просто применить формулу (2) (так как расуждения на этом этапе не изменяются).