Всем привет, меня зовут Андрей!
В прошлых статьях мы рассказывали о том, что есть 4 основных правила сортировки, или фильтрации, кандидатов судоку. А что делать с судоку дальше? Во-первых, можно выяснить, есть ли «очевидные» кандидаты после четырехступенчатой фильтрации, и, во-вторых, выяснить, есть ли «голые пары» кандидатов.
Что такое «голые» пары кандидатов судоку? Если в пределах одной строки, одного столбца или одного квадратика-блока есть две клетки, у которых только одна пара кандидатов, и эти кандидаты полностью совпадают, то мы имеем дело с «голой парой». Не у всякого судоку могут быть «голые пары», но часто бывает так, что одно и то же судоку, не имея «голых пар» на начальной стадии разгадывания, приобретает эти «голые пары» на одном из этапов разгадки. Приведем пример. Допустим, что у нас есть какое-то судоку:
Возможно, частые гости моего канала могут узнать это судоку – ведь именно его мы использовали, когда рассказывали про сортировку, или фильтрацию кандидатов. Но это и неудивительно, что мы будем использовать именно это судоку – ведь мы его еще не отгадали. Для начала покажем те клетки судоку, у которых есть только два кандидата:
У нас всего 5 клеток, в которых есть ровно 2 кандидата. Но при этом ни в строке, ни в столбце, ни в блоке нет одинаковых пар. Это значит, что здесь нет «голых» пар.
Но если мы заполним «очевидные» кандидаты, то у нас уже будет другое судоку. Вот оно:
А вот клетки, содержащие только два кандидата:
Здесь уже есть несколько «голых» пар. Во-первых, в первой строке есть «голая пара»: 3 и 6. Во-вторых, во втором блоке есть такая же «голая» пара. И, в-третьих, в пятой строке есть «голая пара»: 2 и 3.
Как выявление «голых» пар может помочь в решении судоку? Прежде всего, давайте введем новый термин – «фрагмент». Под фрагментом мы будем понимать любую строку, столбец или квадратик-блок судоку. А теперь расскажем про «голые» пары. Если какой-либо фрагмент судоку содержит «голую» пару, то это значит, что все другие ячейки этого фрагмента судоку не могут содержать ни одного кандидата, принадлежащего к этой паре. Другими словами, если вернуться к нашему примеру, можно сказать следующее:
- в первой строке судоку кандидаты 3 и 6 могут быть только в клетках А4 и А6, во всех других ячейках первой строки не может быть ни тройки, ни шестерки;
- во втором блоке судоку кандидаты 3 и 6 могут быть только в клетках А4 и А6;
- в пятом столбце судоку кандидаты 2 и 3 могут быть только в клетках Г5 и Ё5.
А это значит, что если части «голых» пар будут найдены в других ячейках фрагмента, содержащего «голые» пары, то все они будут лишними.
Но продолжим разгадывать наше судоку. Напомню, что в прошлых статьях мы рассмотрели, как можно отсортировать «лишние» кандидаты судоку. Что будем делать дальше? Прежде, чем будем искать "голые" пары, нужно будет сначала продолжить вычислять "однозначные" кандидаты.
Прежде всего проверим, можно ли найти «однозначные» кандидаты судоку, если брать не все кандидаты, а только те, что получились после четырехступенчатой фильтрации кандидатов. Для начала – вычислим, сколько кандидатов будет в каждой ячейке судоку после всех фильтраций. Вот что должно получиться:
Для данного квадрата мы применили два правила условного форматирования. Во-первых, сделали более тусклыми все ноли, во-вторых, применили зеленую заливку для всех единиц. Это сделано для удобства, поскольку ноль означает, что ячейка судоку уже заполнена, для нее не надо искать кандидатов, а единица означает, что есть «однозначный» кандидат, потому что он всего один.
Следующий этап – копирование квадрата с кандидатами-единичками с одновременной заменой пустых ячеек на нули:
Здесь мы применили только одно правило условного форматирования: сделали тусклыми все нули. Цифры вне квадрата – количество кандидатов-единиц внутри каждого из фрагментов. О том, что такое фрагмент судоку, мы уже говорили в данной статье. К цифрам вне квадрата можно при желании добавить условное форматирование, которое будет особо выделять единицы, поскольку один кандидат внутри фрагмента будет указывать на «однозначного» кандидата.
Ноль в GK2 означает. что у нас нет «однозначных» кандидатов. Формула для GK2 простая – из числа единиц в прямоугольнике GL3:GU13 отнимаем число единиц в квадрате GL3:GT11, потому что единицы внутри этого квадрата – просто кандидаты единички. А наличие кандидатов-единичек не всегда означает, что эти кандидаты будут «однозначными». Таким образом, останется только число единичек вне этого квадрата, они и указывают на наличие «однозначных» кандидатов.
Затем аналогичным образом представим другие кандидаты:
После размещения кандидатов в удобном виде мы можем отделить те кандидаты, которые одни по той причине, что для данной ячейки есть просто один кандидат (напомним, что количество кандидатов для каждой ячейки мы уже вычисляли):
Здесь видно, что в клетке Д3 был всего один кандидат, и этот кандидат – тройка. Единица в HU2 именно это и означает: у нас всего 1 кандидат.
Формула для А1 (как всегда, мы при использовании формул показываем формулу для левой верхней клетки квадрата):
=ЕСЛИ(FZ3=1;МАКС(GL3;GX3;HJ3;GL16;GX16;HJ16;GL29;GX29;HJ29);п)
Про русскую букву п мы уже говорили на нашем канале, это имя пустой ячейки, в которой есть после знака равенства только две кавычки подряд.
Формула проста: если для какой-то ячейки есть всего один кандидат, то нужно вычислить сумму всех девяти возможных кандидатов. А раз в восьми случаях из девяти у нас в этих ячейках будет ноль, но максимум из этих девяти чисел и будет тем кандидатом, который нам нужен.
Следующий этап – составление нового судоку:
Как видим, в этом судоку уже есть и те цифры, что были в нашем основном судоку, и наши новые цифры. В нашем примере новая цифра одна – это только тройка (Д3).
Формула для HV15:
=ЕСЛИ(СЧЁТ(C3)+СЧЁТ(HV3)=1;МАКС(C3;HV3);e)
Здесь буква e – латинская буква, полностью аналогичная русской букве «п», о ней мы тоже говорили на нашем канале.
Если мы скопируем это наше новое судоку и с помощью специальной вставки вставим только значения, то в двух последних квадратах – «Всего один кандидат» и «Новое судоку» сразу после вставки могут появиться другие цифры, поскольку на каждой из стадий заполнения судоку могут появляться «однозначные» кандидаты. Чтобы не выполнять несколько раз команды «Копировать», затем «Специальная вставка – значения» лучше создать один макрос, который будет заполнять «однозначные» кандидаты столько раз, сколько это будет нужно.
Вот этот макрос:
Sub Однозначные_после_4_сортировок()
10 If Cells(2, 229).Value > 0 Then
Range("HV15:ID23").Select
Selection.Copy
Range("C3:K11").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("B2").Select
End If
20 If Cells(2, 229).Value > 0 Then GoTo 10
End Sub
Если мы выполним этот макрос, то у нас получится следующее судоку:
В этом судоку уже заполнено чисел: 39 из 81, или почти 50%. Но, тем те менее, если мы выполним макрос «Заполнить_очевидные» или «Однозначные_после_4_сортировок», то у нас все равно будет заполнено только 39. Это значит, что нужно продолжить составлять формулы и макросы, помогающие решать судоку. И хотя мы составили макрос «Однозначные после_4_сортировок», мы пока учли только один вариант, а именно: в ячейке всего 1 кандидат». Следующий этап – поиск кандидатов, единственных в фрагменте – то есть в строке, столбце или блоке.
Хотя в нашем примере таких вариантов нет, но программу для поиска создавать надо, поскольку наша задача – сделать универсальную программу, подходящую для разных случаев.
Поэтому следующий этап будет – вычисление возможных «единственных» в каждом из фрагментов. Вначале в ячейку IF2 ведем следующую формулу:
=GK2+GW2+HI2+GK15+GW15+HI15+GK28+GW28+HI28
Каждое слагаемое этой суммы означает, есть ли «единственные» кандидаты среди единичек, двоек, и так далее. Если вся сумма равна нулю, то этих кандидатов нет, а если эта сумма больше нуля, то у нас появятся другие «очевидные», или «единственные» кандидаты.
Затем можно будет заполнить для каждой из цифр от 1 до 9 следующие 4 квадрата:
В нашем примере все квадраты пусты, но это частный случай. Если мы на место основного судоку (ячейки C3-K11 Excel) поместим самое первоначальное судоку, в котором заполнены были не 39, а только 26 значений, то эти наши квадраты уже будут выглядеть по-другому:
В принципе, мы можем продолжить заполнять наш основной файл именно при том условии, что основное судоку – это то, что представлено в данной статье на рисунке 1, и в этом судоку пока заполнено только 26 цифр.
Поскольку для получения этой единички в клетке Е5 мы не меняли формулы, а поменяли только «основное судоку», то можно сделать вывод: наша формула универсальна, покажет только «очевидные» кандидаты, и не покажет вообще ничего, если таких кандидатов нет.
Ну и для тех гостей моего канала, кто тоже хочет создать эти квадраты у себя на компьютере, но еще не догадался, как именно это сделать, приведем основные формулы:
Формула для IH3:
=ЕСЛИ(И($GU3=1;GL3>0);GL3;e)
Формула для IS3:
=ЕСЛИ(И(GL$12=1;GL3>0);GL3;e)
Формула для IH15:
=ЕСЛИ(И($GL$13=1;GL3>0);GL3;e)
Если первые две формулы были применимы для каждой ячейки того квадрата, в которой они находятся, то третья – только к первому блоку своего квадратика. Если эту формулу заменить на все блоки, то осле этого придется менять «$GL$13». Для второго блока – на $GM$13, для третьего – на $GN$13 ну и так далее, потому что именно в диапазоне от GL13 до GT13 у нас находятся суммы кандидатов-единичек в каждом из блоков судоку.
Четвертый квадрат – «Однозначные 1 – итог» - тоже достаточно прост. Часто бывает так, что одна и та же цифра будет одновременно и единственной в строке, и единственной в столбце, и единственной в блоке. Но иногда она может единственной только для одного фрагмента. Поэтому мы применим следующую формулу для IS15:
=ЕСЛИ(СЧЁТ(IH3)+СЧЁТ(IS3)+СЧЁТ(IH15)=0;п;GL3)
Формула едина для всего квадрата.
После того, как мы заполнили 4 квадрата с единичками, нужно будет заполнить еще 8 четверок – с другими цифрами. Если единицы расположились в клетках от IG1 до JA23, то квадраты со следующими цифрами будут размещаться так:
- двойки: JC1-JW23;
- тройки: JY1-KS23;
- четверки IG25-IA47;
- пятерки: JC25-JW47;
- шестерки: JY25-KS47;
- семерки: IG49-JA71;
- восьмерки: JC49-JW71;
- девятки: JY49-KS71.
В общем, все достаточно просто. Сначала – единицы, двойки и тройки (это будет «первая тройка»), затем, чуть ниже – «вторая тройка», и еще ниже – «третья тройка».
Если мы всё заполнили правильно, то вот как будут выглядеть девятки:
После заполнения трех троек нам понадобится несколько квадратов дли итогов:
Здесь первый квадрат – «всего однозначных» показывает, есть ли «однозначные» кандидаты в судоку после того, как мы выполнили все основные сортировки-фильтрации кандидатов. Ноль означает, что нет «однозначных» кандидатов, единица – что эти кандидаты есть. Если судоку составлен правильно, и не было никаких ошибок во время каждого из этапов его составления, то в этом квадрате не должно быть чисел больше единицы. Любое число больше единицы – это значит «ошибка», потому что в одну и ту же клетку судоку нужно поместить две разные цифры. Это значит, что надо искать ошибку в судоку.
Второй квадрат – это уже непосредственно «однозначные» кандидаты, они же – новые цифры судоку.
Третий получен из второго, но ноли заменены на пустые клетки. KU26 – это число новых чисел судоку. Если KU26 равно нулю, то это значит, что однозначных кандидатов просто нет.
Четвертый квадрат – это уже новое судоку. Если кому интересны формулы в этих квадратах – оставляйте комментарии. KU38, как и KU26, показывает число новых цифр судоку.
После составления всех квадратов можно добавить следующий макрос:
Sub Однозначные_2_после_4_сортировок()
10 If Cells(38, 307).Value > 0 Then
Range("KV39:LD47").Select
Selection.Copy
Range("C3:K11").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("B2").Select
End If
20 If Cells(38, 307).Value > 0 Then GoTo 10
End Sub
Почему в названии присутствует «Однозначные_2»? Все очень просто. Без цифры 2 макрос уже есть, он позволяет найти почти такие же однозначные, но не совсем такие. В первом случае мы искали варианты «всего один кандидат в ячейке», во втором – один «уникальный», то есть: один в строке, в столбце или в блоке. Двадцатая строка макроса позволяет добавлять новые цифры судоку столько раз, сколько это необходимо, ведь с каждой новой цифрой судоку могут появиться новые «уникальные» кандидаты в других ячейках.
Поскольку у нас уже создано несколько макросов, каждый из которых выполняет свою задачу, настало время создать один макрос, запускающий по очереди несколько других макросов. Создадим этот макрос:
Sub Все_судоку()
Application.Run "Судоку_2020.xlsm!Заполнить_очевидные"
Application.Run "Судоку_2020.xlsm!Однозначные_после_4_сортировок"
Application.Run "Судоку_2020.xlsm!Однозначные_2_после_4_сортировок"
End Sub
Если мы запустим этот макрос, то в нашем судоку заполнится только 39 чисел. Кстати, если бы в макросе под названием «Однозначные_после_4_сортировок» не было двадцатой строки, мы бы нашли только одну новую цифру судоку. Но у нас получилось так, что уже до выполнения макроса Application.Run "Судоку_2020.xlsm!Однозначные_2_после_4_сортировок" не осталось ни одного «очевидного» кандидата.
И если мы выясним, в каких ячейках после всех фильтраций кандидатов и выявления новых цифр судоку будут ровно 2 кандидата, то получим вот что:
Как мы видим, ячеек с двумя кандидатами намного больше, чем их было в начале.
В принципе, выполнения один раз макроса «Все_судоку» вполне достаточно, потому что те макросы, которые он запускает, предполагают несколько раз искать новые кандидаты, если после одного запуска макроса выяснится, что есть еще новые «однозначные» кандидаты.
А на этом пока всё, дорогие любители судоку. В следующих статьях будем продолжать решать судоку. Скорее всего, мы найдем «голые» пары кандидатов и попробуем выяснить, можно ли найти еще какие-то новые цифры судоку.