|
Очередная задача конкурса Infinite Search Space:
для решетки NxN требуется заполнить ее ячейки C цветами так, чтобы не было
прямоугольников (имеются в виду прямоугольники со сторонами, параллельными
границам решетки), у которых все четыре угла одинакового цвета. Для заданного
цвета C (в конкурсе от 2 до 21) нужно найти максимальное N. Например, для C = 2
максимальное N = 4. Один из вариантов решения:
До начала конкурса были известны максимальные значения для C=2,3,4. Эти решения
доступны в интернете. Интересна история поиска G4,18 и красивое
решение[1]. Кроме того, в статье "Rectangle Free Coloring of Grids"[2]
был предложен метод для построения Gp,p*p для случая когда p - степень
простого числа.
Текст ниже был написан в процессе работы над задачей. Скорее всего интерес
представляют последние два раздела, где описан способ получения решений для
C = 15 и C = 21.
Обозначения
В grid.pdf принято обозначать: c-coloring Gn,m. Нижние индексы - размер
сетки. Чтобы не писать каждый раз c-coloring, перенесем в нижние индексы и
переменную c. Т.о. Gc|n,m обозначает c-coloring сетку размером nxm.
Если сетка квадратная, второй размер можно не указывать: Gc|n.
Блоки с циклическим сдвигом
Разобьем сетку на блоки размером CxC. Внутри каждого блока CxC будем
использовать заполнение циклическим сдвигом по горизонтали и вертикали.
Каждый такой блок можно закодировать позицией элемента цвета (a) в
первой строке. Если оба сдвига положительны, имеем C блоков.
Например, для C = 5:
Теперь простым перебором будем искать матрицу таких блоков проверяя
правильность решения с учетом структуры выбранных блоков.
Очень быстро такие матрицы находятся для C = 5 и C = 7:
0 | 1 | 2 | 3 | 4
| 4 | 1 | 4 | 4 | 2
| 3 | 1 | 1 | 0 | 0
| 2 | 1 | 3 | 1 | 3
| 1 | 1 | 0 | 2 | 1
| |
|
0 | 1 | 2 | 3 | 4 | 5 | 6
| 6 | 1 | 5 | 0 | 5 | 0 | 4
| 5 | 1 | 1 | 4 | 6 | 2 | 2
| 4 | 1 | 4 | 1 | 0 | 4 | 0
| 3 | 1 | 0 | 5 | 1 | 6 | 5
| 2 | 1 | 3 | 2 | 2 | 1 | 3
| 1 | 1 | 6 | 6 | 3 | 3 | 1
| |
| |
Квадрат G5|25, построенный по этой таблице:
abcde eabcd deabc cdeab bcdea
eabcd deabc cdeab bcdea abcde
deabc cdeab bcdea abcde eabcd
cdeab bcdea abcde eabcd deabc
bcdea abcde eabcd deabc cdeab
bcdea eabcd bcdea bcdea deabc
abcde deabc abcde abcde cdeab
eabcd cdeab eabcd eabcd bcdea
deabc bcdea deabc deabc abcde
cdeab abcde cdeab cdeab eabcd
cdeab eabcd eabcd abcde abcde
bcdea deabc deabc eabcd eabcd
abcde cdeab cdeab deabc deabc
eabcd bcdea bcdea cdeab cdeab
deabc abcde abcde bcdea bcdea
deabc eabcd cdeab eabcd cdeab
cdeab deabc bcdea deabc bcdea
bcdea cdeab abcde cdeab abcde
abcde bcdea eabcd bcdea eabcd
eabcd abcde deabc abcde deabc
eabcd eabcd abcde deabc eabcd
deabc deabc eabcd cdeab deabc
cdeab cdeab deabc bcdea cdeab
bcdea bcdea cdeab abcde bcdea
abcde abcde bcdea eabcd abcde
|
Существуют еще два блока, заполненных циклически, но без сдвига по
вертикали/горизонтали. У Холла[3] эти матрицы названы R и C
R |
C
|
a | a | a | a | a
| b | b | b | b | b
| c | c | c | c | c
| d | d | d | d | d
| e | e | e | e | e
| |
|
a | b | c | d | e
| a | b | c | d | e
| a | b | c | d | e
| a | b | c | d | e
| a | b | c | d | e
| |
| |
Для нас важна еще и позиция цвета (a), поэтому таких матриц будет C
и обозначать их будем R0, R1 … C0, C1 …
Используя эти матрицы мы можем расширить полученное решение вправо или
вниз. Например, расширение вправо:
abcde eabcd deabc cdeab bcdea abcde
eabcd deabc cdeab bcdea abcde abcde
deabc cdeab bcdea abcde eabcd abcde
cdeab bcdea abcde eabcd deabc abcde
bcdea abcde eabcd deabc cdeab abcde
bcdea eabcd bcdea bcdea deabc eabcd
abcde deabc abcde abcde cdeab eabcd
eabcd cdeab eabcd eabcd bcdea eabcd
deabc bcdea deabc deabc abcde eabcd
cdeab abcde cdeab cdeab eabcd eabcd
cdeab eabcd eabcd abcde abcde deabc
bcdea deabc deabc eabcd eabcd deabc
abcde cdeab cdeab deabc deabc deabc
eabcd bcdea bcdea cdeab cdeab deabc
deabc abcde abcde bcdea bcdea deabc
deabc eabcd cdeab eabcd cdeab cdeab
cdeab deabc bcdea deabc bcdea cdeab
bcdea cdeab abcde cdeab abcde cdeab
abcde bcdea eabcd bcdea eabcd cdeab
eabcd abcde deabc abcde deabc cdeab
eabcd eabcd abcde deabc eabcd bcdea
deabc deabc eabcd cdeab deabc bcdea
cdeab cdeab deabc bcdea cdeab bcdea
bcdea bcdea cdeab abcde bcdea bcdea
abcde abcde bcdea eabcd abcde bcdea
|
Или, просто номерами блоков:
0 | 1 | 2 | 3 | 4 | C0
| 4 | 1 | 4 | 4 | 2 | C1
| 3 | 1 | 1 | 0 | 0 | C2
| 2 | 1 | 3 | 1 | 3 | C3
| 1 | 1 | 0 | 2 | 1 | C4
| |
|
0 | 1 | 2 | 3 | 4
| 4 | 1 | 4 | 4 | 2
| 3 | 1 | 1 | 0 | 0
| 2 | 1 | 3 | 1 | 3
| 1 | 1 | 0 | 2 | 1
| R0 | R1 | R2 | R3 | R4
| |
| |
То есть для получения того же решения достаточно матрицы из (C-1)x(C-1) блоков
0 | 1 | 2 | 3 | С0
| 4 | 1 | 4 | 4 | С1
| 3 | 1 | 1 | 0 | С2
| 2 | 1 | 3 | 1 | С3
| R0 | R1 | R2 | R3 | R4
| |
Так вот, для C = 6 не существует матрицы CxC из рассматриваемых нами блоков,
зато существует 10 вариантов (C-1)x(C-1). Один из них
0 | 0 | 0 | 0 | 0 | C0
| 0 | 1 | 2 | 3 | 4 | C1
| 0 | 2 | 4 | 1 | 3 | C2
| 0 | 4 | 1 | 5 | 2 | C3
| 0 | 5 | 3 | 2 | 1 | C4
| R0 | R1 | R2 | R3 | R4 | R5
| |
Некоторые простые замечанию позволяют значительно ускорить перебор
таких блоков. Например, переносом столбцов все блоки в первом ряду
можно привести к 0, также как и все блоки в первой колонке переносом
строк. Во второй строке блоков переносом столбцов блоков можно
расставить блоки по неубыванию, также как и во втором столбце.
Для C = 10 удается сделать полный перебор. Возможна только матрица 8x8
таких блоков и, соответственно, решение G10|90.
Группы ортогональных латинских квадратов
Для полноты картины. Если есть группа ОЛК, то легко получаются
и нужные нам решения. Например, возьмем 4 ортогональных квадрата
пятого порядка
01234 01234 01234 01234
12403 24310 30142 43021
24310 30142 43021 12403
30142 43021 12403 24310
43021 12403 24310 30142
|
Если рассматривать элементы этих квадратов как позицию цвета (a) в
колонке, получаем уже знакомую нам картину:
-
a.... a.... a.... a....
.a... .a... .a... .a...
..a.. ..a.. ..a.. ..a..
...a. ...a. ...a. ...a.
....a ....a ....a ....a
...a. ....a .a... ..a..
a.... ...a. ..a.. ....a
.a... a.... ....a ...a.
....a ..a.. a.... .a...
..a.. .a... ...a. a....
....a .a... ..a.. ...a.
...a. ..a.. ....a a....
a.... ....a ...a. .a...
..a.. a.... .a... ....a
.a... ...a. a.... ..a..
.a... ..a.. ...a. ....a
..a.. ....a a.... ...a.
....a ...a. .a... a....
a.... .a... ....a ..a..
...a. a.... ..a.. .a...
..a.. ...a. ....a .a...
....a a.... ...a. ..a..
...a. .a... a.... ....a
.a... ....a ..a.. a....
a.... ..a.. .a... ...a.
|
Остается только дополнить решение справа C-матрицами.
Конечные проективные плоскости
Еще один вариант построения Gp|p*p (p - простое или степень простого числа) -
использование метода построения конечных проективных плоскостей.
Рассмотрим метод на примере p=9. Возьмем таблицы сложения и умножения в GF(9).
+ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
* |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8
|
---|
0 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0
|
---|
1 |
1 |
2 |
0 |
4 |
5 |
3 |
7 |
8 |
6 |
1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8
|
---|
2 |
2 |
0 |
1 |
5 |
3 |
4 |
8 |
6 |
7 |
2 |
0 |
2 |
1 |
6 |
8 |
7 |
3 |
5 |
4
|
---|
3 |
3 |
4 |
5 |
6 |
7 |
8 |
0 |
1 |
2 |
3 |
0 |
3 |
6 |
2 |
5 |
8 |
1 |
4 |
7
|
---|
4 |
4 |
5 |
3 |
7 |
8 |
6 |
1 |
2 |
0 |
4 |
0 |
4 |
8 |
5 |
6 |
1 |
7 |
2 |
3
|
---|
5 |
5 |
3 |
4 |
8 |
6 |
7 |
2 |
0 |
1 |
5 |
0 |
5 |
7 |
8 |
1 |
3 |
4 |
6 |
2
|
---|
6 |
6 |
7 |
8 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
6 |
3 |
1 |
7 |
4 |
2 |
8 |
5
|
---|
7 |
7 |
8 |
6 |
1 |
2 |
0 |
4 |
5 |
3 |
7 |
0 |
7 |
5 |
4 |
2 |
6 |
8 |
3 |
1
|
---|
8 |
8 |
6 |
7 |
2 |
0 |
1 |
5 |
3 |
4 |
8 |
0 |
8 |
4 |
7 |
3 |
2 |
5 |
1 |
6
|
---|
|
Возьмем строку из девяти блоков 9x9. Рассматривая элементы таблицы сложения
как смещение цвета (a) в строке соответствующего блока получаем:
----0---- ----1---- ----2---- ----3---- ----4---- ----5---- ----6---- ----7---- ----8----
a........ .a....... ..a...... ...a..... ....a.... .....a... ......a.. .......a. ........a
.a....... ..a...... a........ ....a.... .....a... ...a..... .......a. ........a ......a..
..a...... a........ .a....... .....a... ...a..... ....a.... ........a ......a.. .......a.
...a..... ....a.... .....a... ......a.. .......a. ........a a........ .a....... ..a......
....a.... .....a... ...a..... .......a. ........a ......a.. .a....... ..a...... a........
.....a... ...a..... ....a.... ........a ......a.. .......a. ..a...... a........ .a.......
......a.. .......a. ........a a........ .a....... ..a...... ...a..... ....a.... .....a...
.......a. ........a ......a.. .a....... ..a...... a........ ....a.... .....a... ...a.....
........a ......a.. .......a. ..a...... a........ .a....... .....a... ...a..... ....a....
|
Подставляя блоки в таблицу умножения получаем следующую таблицу (показана только ее часть):
----0---- ----0---- ----0---- ----0----
a........ a........ a........ a........
.a....... .a....... .a....... .a.......
..a...... ..a...... ..a...... ..a......
...a..... ...a..... ...a..... ...a.....
....a.... ....a.... ....a.... ... ....a....
.....a... .....a... .....a... .....a...
......a.. ......a.. ......a.. ......a..
.......a. .......a. .......a. .......a.
........a ........a ........a ........a
----0---- ----1---- ----2---- ----8----
a........ .a....... ..a...... ........a
.a....... ..a...... a........ ......a..
..a...... a........ .a....... .......a.
...a..... ....a.... .....a... ..a......
....a.... .....a... ...a..... ... a........
.....a... ...a..... ....a.... .a.......
......a.. .......a. ........a .....a...
.......a. ........a ......a.. ...a.....
........a ......a.. .......a. ....a....
... ... ... ... ...
----0---- ----8---- ----4---- ----6----
a........ ........a ....a.... ......a..
.a....... ......a.. .....a... .......a.
..a...... .......a. ...a..... ........a
...a..... ..a...... .......a. a........
....a.... a........ ........a ... .a.......
.....a... .a....... ......a.. ..a......
......a.. .....a... .a....... ...a.....
.......a. ...a..... ..a...... ....a....
........a ....a.... a........ .....a...
|
Циклическим сдвигом вправо дополняем таблицу другими цветами и получаем
решение G9|81. Собственно, полученая таблица - это часть матрицы
инцидентности для конечной проективной плоскости 9-го порядка. Недостающая
часть достраивается очень легко и из полной матрицы можно мы получаем решение
G10|91.
Добавление C+1 строк при увеличении количества цветов на 1
Gc|n → Gc+1|n+(c+1)
Этот варинат расширения мы уже рассматривали выше. Это простое добавление
R, C-матриц. Мы по-прежнему используем решения из циклически заполненных блоков.
Важное свойство таких блоков, необходимое для расширения - блок является
латинским квадратом.
Добавление C+3 строк при увеличении количества цветов на 1
Gc|n → Gc+1|n+2+(c+1)
Вернемся к решению, построенному по проективной плоскости. По сути это
расширение strong 9-coloring прямоугольника 81x9 до квадрата 81x81.
Взглянем на исходный strong 9-coloring прямоугольник 81x9 (ниже слева).
Его можно рассматривать и как strong 10-coloring прямоугольник, что дает
нам решение 81x90. Кроме того, видно, что прямоугольник можно дополнить
одной строкой из девяток. Ниже в примере девятки заменены символом A,
чтобы были видны изменения. Вторую строку можно добавить, если заменить
девяткой некоторые из ячеек выше. В данном случае для второй строки
был использован простенький перебор.
-
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
A A A A A A A A A
0 1 2 3 4 5 6 7 8 0 1 2 3 A 5 6 7 8
1 2 0 4 5 3 7 8 6 1 2 0 4 5 A 7 8 6
2 0 1 5 3 4 8 6 7 2 A 1 5 3 4 8 6 7
3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2
4 5 3 7 8 6 1 2 0 4 5 3 7 8 6 1 2 0
5 3 4 8 6 7 2 0 1 5 3 4 8 6 7 2 0 1
6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5
7 8 6 1 2 0 4 5 3 7 8 6 1 2 0 4 5 3
8 6 7 2 0 1 5 3 4 8 6 7 2 0 1 5 3 4
0 2 1 6 8 7 3 5 4 0 2 1 6 8 7 3 5 4
1 0 2 7 6 8 4 3 5 1 0 2 7 6 8 4 3 5
2 1 0 8 7 6 5 4 3 2 1 0 A 7 6 5 4 3
3 5 4 0 2 1 6 8 7 3 5 4 0 2 1 6 8 7
4 3 5 1 0 2 7 6 8 4 3 5 1 0 2 7 6 8
5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 A 6
6 8 7 3 5 4 0 2 1 6 8 7 3 5 4 0 2 1
7 6 8 4 3 5 1 0 2 7 6 8 4 3 5 1 0 2
8 7 6 5 4 3 2 1 0 8 7 6 5 A 3 2 1 0
0 3 6 2 5 8 1 4 7 0 3 6 2 5 8 1 4 7
1 4 7 0 3 6 2 5 8 1 4 7 0 3 6 2 5 8
2 5 8 1 4 7 0 3 6 2 5 8 1 A 7 0 3 6
3 6 0 5 8 2 4 7 1 3 6 0 5 8 2 4 7 1
4 7 1 3 6 0 5 8 2 4 7 A 3 6 0 5 8 2
5 8 2 4 7 1 3 6 0 5 8 2 4 7 1 3 6 0
6 0 3 8 2 5 7 1 4 6 A 3 8 2 5 7 1 4
7 1 4 6 0 3 8 2 5 7 1 4 6 0 3 8 2 5
8 2 5 7 1 4 6 0 3 8 2 5 7 1 4 6 0 3
0 4 8 5 6 1 7 2 3 0 4 8 5 6 1 7 2 3
1 5 6 3 7 2 8 0 4 1 5 6 3 7 2 8 0 4
2 3 7 4 8 0 6 1 5 2 3 7 4 8 0 6 1 5
3 7 2 8 0 4 1 5 6 3 7 2 A 0 4 1 5 6
4 8 0 6 1 5 2 3 7 4 8 0 6 1 5 2 3 7
5 6 1 7 2 3 0 4 8 5 6 A 7 2 3 0 4 8
6 1 5 2 3 7 4 8 0 6 1 5 2 3 7 4 8 0
7 2 3 0 4 8 5 6 1 7 2 3 0 A 8 5 6 1
8 0 4 1 5 6 3 7 2 8 A 4 1 5 6 3 7 2
0 5 7 8 1 3 4 6 2 0 5 7 A 1 3 4 6 2
1 3 8 6 2 4 5 7 0 1 3 8 6 2 4 A 7 0
2 4 6 7 0 5 3 8 1 2 4 6 7 0 5 3 8 1
3 8 1 2 4 6 7 0 5 3 8 A 2 4 6 7 0 5
4 6 2 0 5 7 8 1 3 4 6 2 0 5 7 8 1 3
5 7 0 1 3 8 6 2 4 5 7 0 1 3 8 6 2 4
6 2 4 5 7 0 1 3 8 6 2 4 5 7 0 1 3 8
7 0 5 3 8 1 2 4 6 7 A 5 3 8 1 2 4 6
8 1 3 4 6 2 0 5 7 8 1 3 4 6 2 0 5 7
0 6 3 1 7 4 2 8 5 0 6 3 1 7 4 2 8 5
1 7 4 2 8 5 0 6 3 1 7 4 2 8 5 0 6 3
2 8 5 0 6 3 1 7 4 2 8 5 0 6 A 1 7 4
3 0 6 4 1 7 5 2 8 3 A 6 4 1 7 5 2 8
4 1 7 5 2 8 3 0 6 4 1 7 5 2 8 3 0 6
5 2 8 3 0 6 4 1 7 5 2 8 3 0 6 4 1 7
6 3 0 7 4 1 8 5 2 6 3 0 7 4 1 8 5 2
7 4 1 8 5 2 6 3 0 7 4 A 8 5 2 6 3 0
8 5 2 6 3 0 7 4 1 8 5 2 6 3 0 7 4 1
0 7 5 4 2 6 8 3 1 0 7 5 4 2 6 8 3 1
1 8 3 5 0 7 6 4 2 1 8 3 5 0 7 6 4 2
2 6 4 3 1 8 7 5 0 2 6 4 3 1 8 7 5 0
3 1 8 7 5 0 2 6 4 3 1 8 7 5 0 2 6 4
4 2 6 8 3 1 0 7 5 4 2 6 A 3 1 0 7 5
5 0 7 6 4 2 1 8 3 5 A 7 6 4 2 1 8 3
6 4 2 1 8 3 5 0 7 6 4 2 1 8 A 5 0 7
7 5 0 2 6 4 3 1 8 7 5 0 2 6 4 3 1 8
8 3 1 0 7 5 4 2 6 8 3 A 0 7 5 4 2 6
0 8 4 7 3 2 5 1 6 0 8 4 7 3 2 A 1 6
1 6 5 8 4 0 3 2 7 1 6 5 A 4 0 3 2 7
2 7 3 6 5 1 4 0 8 2 7 3 6 5 1 4 0 8
3 2 7 1 6 5 8 4 0 3 2 7 1 6 5 8 4 0
4 0 8 2 7 3 6 5 1 4 A 8 2 7 3 6 5 1
5 1 6 0 8 4 7 3 2 5 1 6 0 8 4 7 3 2
6 5 1 4 0 8 2 7 3 6 5 A 4 0 8 2 7 3
7 3 2 5 1 6 0 8 4 7 3 2 5 1 6 0 8 4
8 4 0 3 2 7 1 6 5 8 4 0 3 2 7 1 6 5
A 0 1 8 4 3 5 7 6
|
Замены подобраны так, что каждый из блоков (теперь их стало 10) по-прежнему
остается латинским квадратом и, следовательно, мы можем дополнить справа
и снизу R,C-матрицами. Получаем прямоугольник 93x100.
Добавление C+2 строк при увеличении количества цветов на 1
Gc|n → Gc+1|n+1+(c+1)
Исторически это решение было получено ранее предыдущего. При добавлении
одного цвета это решение не дает нам ничего нового, но от него проще перейти
к следующему решению для добавления двух цветов.
Используемые нами выше в почти всех решениях блоки имеют одно интересное
свойство. При циклическом заполнении всегда используется один
вид диагоналей. Это приводит к тому, что для блоков нечетного размера
второй вид диагоналей содержит разные цвета. Возьмем, например, блок
с кодом 0. Прямые диагонали содержат ячейки одинакового цвета,
обратные - разного.
a | b | c | d | e
| e | a | b | c | d
| d | e | a | b | c
| c | d | e | a | b
| b | c | d | e | a
| |
То есть любую из обратных диагоналей можно заменить новым цветом, саму
диагональ вынести вверх или/и влево и получившийся прямоугольник останется
латинским. Варинаты такой замены:
a | c | e | b | d
| F | b | c | d | e
| e | a | b | c | F
| d | e | a | F | c
| c | d | F | a | b
| b | F | d | e | a
| |
|
a | F | b | c | d | e
| d | e | a | b | c | F
| b | d | e | a | F | c
| e | c | d | F | a | b
| c | b | F | d | e | a
| |
|
| a | c | e | b | d
| a | F | b | c | d | e
| d | e | a | b | c | F
| b | d | e | a | F | c
| e | c | d | F | a | b
| c | b | F | d | e | a
| |
|
a | F | c | e | b | d
| F | a | b | c | d | e
| d | e | a | b | c | F
| b | d | e | a | F | c
| e | c | d | F | a | b
| c | b | F | d | e | a
| |
| |
Обратите внимание на последнюю замену. Верхний левый угловой элемент можно
заполнить новым цветом (F), но можно сделать и обратную замену цветов. В
данном случае элемент заполнен цветом (a), а в основном блоке цвет (a),
который был вынесен, возвращен обратно и вместо него в верхнюю строку
и левую колонку вынесен цвет (F).
Зайдем с другой стороны. Возьмем строку блоков из решения G5|25:
abcde eabcd deabc cdeab bcdea
eabcd deabc cdeab bcdea abcde
deabc cdeab bcdea abcde eabcd
cdeab bcdea abcde eabcd deabc
bcdea abcde eabcd deabc cdeab
|
Вынесем из первой строки цвета (a) вверх и заменим их цветом (F).
a a a a a
Fbcde eFbcd deFbc cdeFb bcdeF
eabcd deabc cdeab bcdea abcde
deabc cdeab bcdea abcde eabcd
cdeab bcdea abcde eabcd deabc
bcdea abcde eabcd deabc cdeab
|
Это то же самое, как если бы мы разделили строку на две части - одна
часть - цвета (a), другая все остальные цвета. Естественно, после такого
деления решение остается корректным. Заменив пустые места цветом (F)
мы тоже не утратим правильность, т.к. эти позиции ранее занимал цвет (a).
Аналогично, можно вынести цвет (с ) из последней строки, цвет (e) из
предпоследней строки:
ac ac ac ac c a
Fbcde eFbcd deFbc cdeFb bcdeF
eabcd deabc cdeab bcdea abcde
deabc cdeab bcdea abcde eabcd
cdeab bcdea abcde eabcd deabc
bFdea abFde eabFd deabF Fdeab
|
и так далее. В результате верняя строка будет заполнена полность, а
цвет (F) займет в каждом блоке обратную диагональ.
Иными словами: Берем строку блоков. В первой строке выбираем произвольный
цвет и для каждого блока, начиная с этого цвета заменяем цвета обратной
диагонали новым цветом, перемещая замененные цвета в верхнюю строку.
Аналогично можно поступить и с колонкой блоков.
Теперь возьмем готовое решение, полученном из конечных геометрий, и
применим эту процедуру к верхней строке и левой колонке блоков:
G5|25 → G6|32:
Исходный квадрат | Результат
|
abcde eabcd deabc cdeab bcdea
eabcd deabc cdeab bcdea abcde
deabc cdeab bcdea abcde eabcd
cdeab bcdea abcde eabcd deabc
bcdea abcde eabcd deabc cdeab
bcdea eabcd bcdea bcdea deabc
abcde deabc abcde abcde cdeab
eabcd cdeab eabcd eabcd bcdea
deabc bcdea deabc deabc abcde
cdeab abcde cdeab cdeab eabcd
cdeab eabcd eabcd abcde abcde
bcdea deabc deabc eabcd eabcd
abcde cdeab cdeab deabc deabc
eabcd bcdea bcdea cdeab cdeab
deabc abcde abcde bcdea bcdea
deabc eabcd cdeab eabcd cdeab
cdeab deabc bcdea deabc bcdea
bcdea cdeab abcde cdeab abcde
abcde bcdea eabcd bcdea eabcd
eabcd abcde deabc abcde deabc
eabcd eabcd abcde deabc eabcd
deabc deabc eabcd cdeab deabc
cdeab cdeab deabc bcdea cdeab
bcdea bcdea cdeab abcde bcdea
abcde abcde bcdea eabcd abcde
|
|
a|Fcebd daceb bdace ebdac cebda|abcdeF
-|-----------------------------|------
F|abcde eFbcd deFbc cdeFb bcdeF|abcdeF
d|eabcF Feabc cFeab bcFea abcFe|abcdeF
b|deaFc cdeaF Fcdea aFcde eaFcd|abcdeF
e|cdFab bcdFa abcdF Fabcd dFabc|abcdeF
c|bFdea abFde eabFd deabF Fdeab|abcdeF
| |
c|bFdea eabcd bcdea bcdea deabc|bcdeFa
a|Fbcde deabc abcde abcde cdeab|bcdeFa
d|eabcF cdeab eabcd eabcd bcdea|bcdeFa
b|deaFc bcdea deabc deabc abcde|bcdeFa
e|cdFab abcde cdeab cdeab eabcd|bcdeFa
| |
e|cdFab eabcd eabcd abcde abcde|cdeFab
c|bFdea deabc deabc eabcd eabcd|cdeFab
a|Fbcde cdeab cdeab deabc deabc|cdeFab
d|eabcF bcdea bcdea cdeab cdeab|cdeFab
b|deaFc abcde abcde bcdea bcdea|cdeFab
| |
b|deaFc eabcd cdeab eabcd cdeab|deFabc
e|cdFab deabc bcdea deabc bcdea|deFabc
c|bFdea cdeab abcde cdeab abcde|deFabc
a|Fbcde bcdea eabcd bcdea eabcd|deFabc
d|eabcF abcde deabc abcde deabc|deFabc
| |
d|eabcF eabcd abcde deabc eabcd|eFabcd
b|deaFc deabc eabcd cdeab deabc|eFabcd
e|cdFab cdeab deabc bcdea cdeab|eFabcd
c|bFdea bcdea cdeab abcde bcdea|eFabcd
a|Fbcde abcde bcdea eabcd abcde|eFabcd
-|-----------------------------|------
F|aaaaa bbbbb ccccc ddddd eeeee|Fabcde
a|bbbbb ccccc ddddd eeeee FFFFF|Fabcde
b|ccccc ddddd eeeee FFFFF aaaaa|Fabcde
c|ddddd eeeee FFFFF aaaaa bbbbb|Fabcde
d|eeeee FFFFF aaaaa bbbbb ccccc|Fabcde
e|FFFFF aaaaa bbbbb ccccc ddddd|Fabcde
|
| |
еще один вариант
-
b|acebd daceb bdace ebdac cebda|FFFFFF
--------------------------------------
a|Fbcde eFbcd deFbc cdeFb bcdeF|abcdeF
d|eabcF Feabc cFeab bcFea abcFe|abcdeF
b|deaFc cdeaF Fcdea aFcde eaFcd|abcdeF
e|cdFab bcdFa abcdF Fabcd dFabc|abcdeF
c|bFdea abFde eabFd deabF Fdeab|abcdeF
| |
c|bFdea eabcd bcdea bcdea deabc|bcdeFa
a|Fbcde deabc abcde abcde cdeab|bcdeFa
d|eabcF cdeab eabcd eabcd bcdea|bcdeFa
b|deaFc bcdea deabc deabc abcde|bcdeFa
e|cdFab abcde cdeab cdeab eabcd|bcdeFa
| |
e|cdFab eabcd eabcd abcde abcde|cdeFab
c|bFdea deabc deabc eabcd eabcd|cdeFab
a|Fbcde cdeab cdeab deabc deabc|cdeFab
d|eabcF bcdea bcdea cdeab cdeab|cdeFab
b|deaFc abcde abcde bcdea bcdea|cdeFab
| |
b|deaFc eabcd cdeab eabcd cdeab|deFabc
e|cdFab deabc bcdea deabc bcdea|deFabc
c|bFdea cdeab abcde cdeab abcde|deFabc
a|Fbcde bcdea eabcd bcdea eabcd|deFabc
d|eabcF abcde deabc abcde deabc|deFabc
| |
d|eabcF eabcd abcde deabc eabcd|eFabcd
b|deaFc deabc eabcd cdeab deabc|eFabcd
e|cdFab cdeab deabc bcdea cdeab|eFabcd
c|bFdea bcdea cdeab abcde bcdea|eFabcd
a|Fbcde abcde bcdea eabcd abcde|eFabcd
--------------------------------------
F|aaaaa bbbbb ccccc ddddd eeeee|Fabcde
a|bbbbb ccccc ddddd eeeee FFFFF|Fabcde
b|ccccc ddddd eeeee FFFFF aaaaa|Fabcde
c|ddddd eeeee FFFFF aaaaa bbbbb|Fabcde
d|eeeee FFFFF aaaaa bbbbb ccccc|Fabcde
e|FFFFF aaaaa bbbbb ccccc ddddd|Fabcde
|
Добавление C+10 строк при увеличении количества цветов на 2
Gc|n → Gc+2|n+8+(c+2)
Теперь у нас два свободных цвета. Один из них будем использовать чтобы
вынести элементы влево, другой для перемещения вверх. Для каждой строки
и колонки блоков выбираем один цвет и используем обратные диагонали,
которые начинаются с этого цвета.
. acebd . daceb . bdace . ebdac . cebda
a Fbcde e FGbcd c deGbF a cdeGb d bcFeG
d eabcF c GeabF a cGeFb d bcGea b aFcGe
b deaFc a cdeFG d GcFea b aGcde e FaGcd
e cdFab d bcFGa b aFcdG e Gabcd c dGabF
c bFdea b aFGde e FabGd c deabG a GdeFb
. daceb . ebdac . daceb . daceb . cebda
c bFdGa e Fabcd d bcFGa d bcFGa c dGabF
a FbGde c deabF b aFGde b aFGde a GdeFb
d eGbcF a cdeFb e FGbcd e FGbcd d bcFeG
b GeaFc d bcFea c GeabF c GeabF b aFcGe
e cdFaG b aFcde a cdeFG a cdeFG e FaGcd
. acebd . ebdac . ebdac . bdace . bdace
e cdFab e Fabcd e Fabcd b aFcdG b aFcdG
c bFdea c deabF c deabF e FabGd e FabGd
a Fbcde a cdeFb a cdeFb c deGbF c deGbF
d eabcF d bcFea d bcFea a cGeFb a cGeFb
b deaFc b aFcde b aFcde d GcFea d GcFea
. cebda . ebdac . acebd . ebdac . acebd
b dGaFc e Fabcd a cdGFb e Fabcd a cdGFb
e GdFab c deabF d bGFea c deabF d bGFea
c bFdeG a cdeFb b GFcde a cdeFb b GFcde
a FbcGe d bcFea e FabcG d bcFea e FabcG
d eaGcF b aFcde c deaGF b aFcde c deaGF
. ebdac . ebdac . bdace . cebda . ebdac
d GabcF e Fabcd b aFcdG c dGabF e Fabcd
b deaFG c deabF e FabGd a GdeFb c deabF
e cdFGb a cdeFb c deGbF d bcFeG a cdeFb
c bFGea d bcFea a cGeFb b aFcGe d bcFea
a FGcde b aFcde d GcFea e FaGcd b aFcde
|
Выбор начальных цветов диагоналей можно сделать таким, что для всех
диагональных блоков этот цвет будет в левом верхнем углу. В этом случае
обратные диагонали внутри блока для обеих цветов совпадают и мы используем
только один цвет. Тогда для углового элемента можно сделать замену
углового элемента. Кроме диагональных элементов будут и другие блоки,
в которых заменена только одна диагональ. В таких блоках также можно сделать
замену углового элемента.
a Fcebd . daceb . bdace . ebdac . cebda
F abcde e FGbcd c deGbF a cdeGb d bcFeG
d eabcF c GeabF a cGeFb d bcGea b aFcGe
b deaFc a cdeFG d GcFea b aGcde e FaGcd
e cdFab d bcFGa b aFcdG e Gabcd c dGabF
c bFdea b aFGde e FabGd c deabG a GdeFb
. daceb e Fbdac . daceb . daceb . cebda
c bFdGa F eabcd d bcFGa d bcFGa c dGabF
a FbGde c deabF b aFGde b aFGde a GdeFb
d eGbcF a cdeFb e FGbcd e FGbcd d bcFeG
b GeaFc d bcFea c GeabF c GeabF b aFcGe
e cdFaG b aFcde a cdeFG a cdeFG e FaGcd
. acebd e Fbdac e Fbdac . bdace . bdace
e cdFab F eabcd F eabcd b aFcdG b aFcdG
c bFdea c deabF c deabF e FabGd e FabGd
a Fbcde a cdeFb a cdeFb c deGbF c deGbF
d eabcF d bcFea d bcFea a cGeFb a cGeFb
b deaFc b aFcde b aFcde d GcFea d GcFea
. cebda e Fbdac . acebd e Fbdac . acebd
b dGaFc F eabcd a cdGFb F eabcd a cdGFb
e GdFab c deabF d bGFea c deabF d bGFea
c bFdeG a cdeFb b GFcde a cdeFb b GFcde
a FbcGe d bcFea e FabcG d bcFea e FabcG
d eaGcF b aFcde c deaGF b aFcde c deaGF
. ebdac e Fbdac . bdace . cebda e Fbdac
d GabcF F eabcd b aFcdG c dGabF F eabcd
b deaFG c deabF e FabGd a GdeFb c deabF
e cdFGb a cdeFb c deGbF d bcFeG a cdeFb
c bFGea d bcFea a cGeFb b aFcGe d bcFea
a FGcde b aFcde d GcFea e FaGcd b aFcde
|
Мы приходим к вспомогательной задаче: заполнить двумя цветами как можно
больший квадрат, в котором часть ячеек уже занята. Для нашего примера
это квадрат из угловых элементов:
a....
.e...
.ee..
.e.e.
.e..e
|
Найдя такое заполнение, мы сможем заполнить угловые элементы цветами F,G,
а незаполненные угловые элементы удалить вместе с содержащими их
строками и столбцами. Как оказалось двумя цветами можно заполнить
квадрат без диагонали до размера 7x7 включительно:
1 2 3 4 5 6 7
----------------------------------------------------------------------------------
. . 0 . 0 0 . 0 0 0 . 0 0 0 1 . 0 0 0 1 1 . 1 1 1 0 0 0
0 . 0 . 0 0 . 0 1 0 . 0 1 0 0 . 0 1 1 0 0 . 1 0 1 1 0
0 0 . 0 0 . 1 0 0 . 1 1 0 0 . 1 0 1 0 0 . 1 1 0 1
0 1 1 . 0 1 1 . 1 1 0 1 . 1 0 0 1 0 . 0 1 1
1 0 1 1 . 0 1 1 0 . 1 1 0 0 1 . 1 0
1 1 0 1 0 . 1 0 1 0 0 . 1
1 1 0 0 1 0 .
|
Для квадрата 8x8 найдено решение с восемью дырками (кроме диагонали):
8:8 ->
. 1 . 1 1 0 0 0
1 . 1 1 0 1 0 .
. 0 . 0 1 1 1 0
1 1 0 . 0 . 1 0
. 0 0 1 . 0 1 1
1 . 0 0 1 . 0 1
0 1 1 0 0 0 . 1
0 0 1 . 1 . 0 .
|
Для квадрата 9x9 найдено только решение с 14-ю дырками (кроме диагонали)
9:14 ->
. 1 . 1 . 1 0 0 0
1 . 1 . 0 0 0 . 1
. 1 . 0 1 0 . 0 1
1 . 0 . 0 1 1 0 .
. 0 0 0 . 1 0 1 1
0 1 1 0 0 . 1 1 0
1 0 . 1 1 0 . 1 0
0 . 0 1 . 0 1 . 1
0 0 1 . 1 1 . 0 .
|
Возвращаясь к нашей задаче для C = 15,21 удалось найти расположение
угловых элементов 8x8, которое можно дополнить двумя цветами. Поэтому при
увеличении цвета на 2 размер квадрата увеличивается на (8+(c+2)), естественно
для c ≥ 8.
Остальные угловые элементы я заполнял используя алгоритм "отжига". Этим методом
удалось получить G15|197 (т.е. заполнены все угловые элементы)
и G21|400 (осталась незаполненной одна строка и одна колонка).
|