Найти тему

Решаем судоку. Часть 2 - находим кандидаты - единички.

Всем привет, меня зовут Андрей!

В прошлой статье я рассказывал о подготовке файла Excel для решения судоку. В этой статье я расскажу о том, как можно рассчитать все «кандидаты» для каждой из клеток судоку.

Напомню, что такое «кандидат». «Кандидат» - это возможные цифры, которые могут находиться в незаполненных клетках судоку. Чем меньше кандидатов у отдельно взятой клетки судоку, тем лучше. Если у клетки судоку всего один кандидат – то он автоматически перестает быть кандидатом, потому что становится уже конкретным числом судоку.

Приведем пример. Пусть есть одно судоку:

Рис. 1. Судоку.
Рис. 1. Судоку.

Прежде всего хотелось бы сказать про цифру 32, которую мы видим в левом верхнем углу заголовка судоку. 32 – это число заполненных цифр судоку. Формула для подсчета простая:

=СЧЁТ(C3:K11)

В прошлой статье про судоку мы уже говорили, что основные клетки судоку мы будем размещать в ячейках Excel от C3 до K11. Следовательно, эта вышеприведенная формула [=СЧЁТ(C3:K11)] будет находиться в ячейке B2 Excel.

Но вернемся к нашему судоку и к кандидатам. У клетки Ё4 нашего судоку есть всего один кандидат – это единица (цифра 1). Ё4 – это седьмая строка, четвертый столбец и восьмой квадратик судоку. О том, как нумеровать строки, столбцы и квадратики судоку – мы рассказывали в прошлой статье, если кто не еще ее читал – приглашаю на мой канал!

Если собрать все числа, которые уже есть в строке № 7, в столбце № 4 и в квадратике № 8, то мы увидим, что там встречаются как минимум один раз все цифры, кроме единицы. Это значит, что единица – единственный кандидат для Ё4. А единственный кандидат перестает быть кандидатом, потому что он становится той цифрой, которая должна находится в судоку в клетке Ё4.

Что касается автоматизации в вычислении кандидатов – здесь все не очень просто. Сразу выяснить, сколько именно кандидатов есть у каждой свободной клетки судоку, не получится. Но здесь уместен принцип «нужно кушать слона по частям».

Начнем вычисление с того, что на отдельном листе Excel – назовем его «Имена» - разместим 9 цифр:

Рис. 2. Фрагмент листа "Имена" Excel
Рис. 2. Фрагмент листа "Имена" Excel

Затем присвоим имена – ячейке B2 – имя «один», B3 – «два», B4 – «три», ну и так далее. Остальные имена будут сверху вниз: «четыре», «пять», «шесть», «семь», «восемь» и «девять». Конечно же, в графе «имена» будут эти буквенные названия цифр без кавычек.

Мы неспроста выделили ячейки C2 и C3. Это не просто пустые ячейки, а ячейки с формулами:

=ʺʺ

Это нужно для того, чтобы исключить присвоение нулевого значения пустой ячейке. "Ноль" и "ничего" - это разные вещи. Имена у этих ячеек будет следующее: у ячейки C2 – п (это имя, состоящее из одной буквы – русской буквы «п» - от слова «пустота»); у ячейки C3 – e (тоже одна буква, латинская буква e, от слова «empty».

После присвоения имен мы можем продолжить программирование. В данной статье расскажем только о том, как вычислить, для каких клеток судоку возможен кандидат 1 (единица).

Первый этап – замена заполненных клеток судоку на двойные звездочки:

Рис. 3. Замена пустых клеток судоку на двойные звездочки.
Рис. 3. Замена пустых клеток судоку на двойные звездочки.

Формулы для этого квадратика достаточно просты. Например, для ячейки O3 Excel – она же клетка A1 судоку:

=ЕСЛИ(СМЕЩ(B2;1;1)=п;"**";СМЕЩ(B2;1;1))

Вот здесь и понадобилась наша переменная – русская буква «п». Если скопировать эту формулу и вставить на весь диапазон, в котором находится квадрат, то квадрат будет заполнен полностью. Никаких изменений вносить в формулу не потребуется.

Можно было эту формулу записать и по-другому:

=ЕСЛИ(C3=п;"**";C3)

Но часто бывает так, что при создании формул используется не только клавиатура, но и мышка. А если мышкой выделить ячейку C3, то в поле имени мы увидим не C3, а «кле_А1», потому что именно это имя присвоено данной клетке. При копировании этой формулы на другие клетки мы получим то, что имя «кле_1» останется без изменения при копировании. Для нас этот вариант не подойдет, поэтому лучше сразу использовать ту формулу, которая содержит «волшебное слово» – «СМЕЩ». То есть, «СМЕЩ(B2;1;1)» – это все равно, что C3, потому что при смещении от ячейки B2 на одну клетку по вертикали и на одну по горизонтали получится именно C3. А при копировании этой формулы на другие ячейки мы получим изменение формулы, и в результате для каждой из клеток судоку будет получен нужный нам результат – копия числа в заполненной ячейке, или две звездочки для пустой клетки судоку.

Продолжим искать кандидаты-единицы. Нарисуем второй квадрат:

Рис. 4. Сумма единиц в строках, столбцах и квадратиках судоку.
Рис. 4. Сумма единиц в строках, столбцах и квадратиках судоку.

Как мы уже знаем, каждое судоку состоит из строк, столбцов и квадратиков. В приведенном выше рисунке мы заменяем каждую клетку судоку на сумму единиц, находящихся в той же строке, в том же столбце, и в том же квадратике, в которых расположена данная клетка судоку. Например, левая верхняя цифра – единица, потому в нашем исходном судоку (рис. 1) в первой строке нет единиц (их 0), в первом столбце – тоже ноль, а в первом квадратике –одна единица. Итого единиц: 0+0+1 – это 1. Теперь понятно, почему в нашем квадрате (рис. 3) все цифры могут быть только от 0 до 3 – ведь сумма единиц в строке, столбце и квадратике одного судоку не может быть больше трех и не может быть меньше нуля.

Следующий этап – непосредственно выявление тех клеток судоку, для которых возможен кандидат единица.

Рис. 5. Клетки судоку, в которых может находиться единица.
Рис. 5. Клетки судоку, в которых может находиться единица.

Что мы видим на данном рисунке? Мы видим все те клетки судоку, для которых возможен кандидат 1 (единица).

Справа от этого квадрата – число кандидатов-единиц в каждой из строк судоку; внизу от судоку число кандидатов-единиц в каждом столбце и в каждом квадратике.

Итак, мы нашли те клетки судоку, для которых возможен кандидат единица. Иногда уже этих данных бывает достаточно, чтобы вычислить «однозначные кандидаты».

Конечно же, "однозначный кандидат" может быть любым, а не только единицей. Если бы в какой-то строке, столбце или квадратике был бы всего один кандидат (например, одна единица, одна двойка и так далее) – тогда это число перестало бы быть кандидатом. Поэтому для всех тех цифр, что находятся справа и снизу от квадрата с кандидатами, можно добавить условное форматирование.

Рис. 6. Условное форматирование.
Рис. 6. Условное форматирование.

Итак, если среди этих цифр встретится единица – то ее формат будет отличаться. В нашем примере – ячейки, содержащие единицы, будут приобретать зеленую заливку.

Кстати, это правило можно использовать и в других случаях – закрашивать в зеленый цвет нужные значения. Можно также закрашивать красным цветом те значения, которые свидетельствуют о какой-нибудь ошибки или об отклонении от какой-то нормы.

Что делать дальше – об этом расскажем в следующих статьях. Поэтому я приглашаю всех любителей математики, Excel и, конечно же, судоку: подписывайтесь на мой канал и ждите новых статей на эту тему.

...Продолжение следует...