Как сделать судоку в excel

Обновлено: 07.07.2024

Как видим, факториалы чисел от 1 до 11 показаны как есть. А уже начиная с 12-ти мы видим упрощение и округление чисел. Так, для числа «факториал 12-ти» мы видим следующее: 4,79Е+08. Как это понимать? Да очень просто: 4,79 надо умножить на 10 в восьмой степени. Не просто в восьмой, а в плюс восьмой. Так-то оно так, да не совсем, потому что из-за такого округления мы теряем возможность увидеть все цифры этого числа. Так вот, эта моя статья посвящена именно любителям больших чисел. Тем, кто хочет при умножении видеть не округленное большое число, а каждую цифру этого числа. А начнем именно с факториала двенадцати.

Итак, факториал двенадцати, или 12!, это есть произведение 12-ти чисел:

Давайте сначала умножим первые шесть цифр, то есть найдем факториал шести. С этой задачей вполне справится Excel, при этом большое число округляться не будет. И в первом рисунке мы это число уже видели. Итак, факториал шести – это 720.

Теперь найдем второе число, или второй множитель. Для этого умножим тоже 6 чисел, и с этой задачей тоже Excel справится без округления. Итак, считаем, сколько будет 7*8*9*10*11*12. Это просто, и это будет 665280.

Кстати, открою один секрет. Даже в том случае, если Excel отображает число в таком упрощенном, или округленном виде, мы можем с этим числом выполнять любые операции, например, деление или умножение. И если результат деления одного большого числа на другое будет не очень большим, то мы увидим каждую цифру этого результата, полученного при делении. То есть (вернемся к нашему первому рисунку), если мы в какой-то свободной клетке напишем следующую формулу:

=B12/B6

то получим результат – 665280. Потому что при этом делении мы в числителе «видим» одно число, округленное, а сам Excel точно знает каждую цифру этого числа. И Excel берет для числителя не 479000000, а более точное число. Excel это число знает, да не хочет нам показывать.

Итак, у нас уже есть два числа, и их надо перемножить. Первое число: 720, а второе – 665280.

Сами числа, которые надо перемножить, нам уже известны. Что будем делать дальше? Вначале выясним, сколько цифр в каждом из чисел. В нашем случае – это 3 (3 цифры в числе 720) и 6 (шесть цифр в числе 665280).

Затем построим квадратик 6 на 6, потому что именно 6 – это максимальное число среди этих двух (3 и 6). Вот этот квадратик:

Бледно-синим выделен тот самый квадратик 6 на 6; рядом с ним – шесть клеток розового и шесть клеток желтого цветов. Вот с них-то мы и начнем заполнение.

Поскольку 720 – это меньшее число, и цифр в нем на 3 меньше, чем во втором числе, то нам надо добавить три ноля в начале этого числа. Итак, одно число это 000720, второе – 665280. Поместим эти числа рядом с нашим квадратиком следующим образом:

Заполняем основные цифры, которые нужня для синего квадратика. Заполняем основные цифры, которые нужня для синего квадратика.

Следующий этап – заполнение синего квадратика. Здесь все просто. Нужно каждую цифру одного числа умножить на каждую цифру другого. Достаточно одной формулы. Если, например в N9 ввести формулу:

и с помощью тандема копировать-вставить вставить эту формулу на весь синий квадратик, то вот что получится:

Затем нам понадобится еще один такой же квадрат, но цифры в нем будут соответствовать номерам диагоналей первого (левого) синего квадрата:

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

Два синих квадрата, к одному из которых применено условное форматирование Два синих квадрата, к одному из которых применено условное форматирование

Что делать дальше с этими двумя квадратами?

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

Сначала находим единицу в правом синем квадрате. Это значит, что мы вычисляем цифру № 1 в нашем произведении, причем нумерация эта (здесь и далее в данной статье, если иное не будет оговариваться отдельно) идет, как сказали бы железнодорожники, «с хвоста поезда». То есть: не слева направо, а справа налево. Цифру 1 имеет в правом квадрате только одна клетка, самая правая нижняя. А это значит, что для нахождения цифры № 1 в нашем произведении нам понадобится та же цифра (правая и нижняя), но в левом синем квадрате. И для нахождения этой цифры можно воспользоваться очень простой формулой. Но перед вводом этой формулы мы добавим в наш лист всего два имени: ква1 – для левого синего квадратика и ква2 – для правого синего. И тогда наша формула будет иметь следующий вид:

Поскольку массивы ква1 и ква2 имеют одинаковый размер, то эта формула в переводе на русский язык звучит так: "просуммировать такие ячейки в квадрате 1, что стоят на местах, занимаемых в квадрате 2 единицей". Результат будет – ноль. Если бы результат был двузначным, то мы бы воспользовались принципом «одно пишем, другое в уме». Но об этом чуть позже, мы еще с похожей ситуацией в нашем примере столкнемся.

Кстати, я уже раньше писал на своем канале про функцию СУММПРОИЗВ, я говорил о том, что это намного больше, чем просто сумма произведений. И вот тут как раз мы столкнулись с одним из многочисленных примеров применения данной функции.

Итак, переходим к числу № 2 нашего произведения. Заменив в этой формуле после второго (правого) знака равно 1 на 2, мы получим тоже 0. Это неудивительно, ведь в каждом из наших множителей есть ноль справа.

А вот с цифрой № 3 начинается самое интересное. Меняем в той же формуле 2 на 3:

Результат: 16. Действительно, если брать ту самую диагональ правого квадрата, которая содержит тройки в правом квадрате, то мы получим:

Это значит, что в нашем произведении третья цифра будет 6, а единица – это та цифра, которая «в уме».

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

В теме “Кодирование и обработка числовой информации” есть подтема “Электронные таблицы”, в которой ученики 8 и 11 классов (УМК Угриновича Н.Д.) изучают сложный раздел “Встроенные функции Excel”. Для того чтобы упростить подачу такого непростого материала и повысить мотивацию учащихся, я использую судоку.

Судоку – математическая игра-головоломка, известная в России довольно давно под названием “Магический квадрат”.

Классический вариант японского судоку – это квадрат 9х9 клеток, в котором необходимо расставить цифры от 1 до 9 так, чтобы в каждой строке, в каждом столбце и в каждом выделенном квадрате 3х3 все цифры были различны.

Я предлагаю учащимся сделать проверку судоку в Excel, чтобы повторить некоторые встроенные функции, а также понятие диапазона ячеек.

Нам потребуется знание одной математической функции: =СУММ(ячейка1;я чейка2)

и двух логических функций, совмещенных в одну сложную: =ЕСЛИ(И(ячейка1=45; ячейка2=45); “молодец!”; “попробуй еще!”)

Теперь можно начать писать формулы для проверки правильности решения судоку. Например, в 11 строке мы напишем все формулы для проверки строк квадрата судоку. Итак, в ячейке А11 будет находиться формула =СУММ(A1:I1), в ячейке В11 будет находиться формула =СУММ(A2:I2) и так далее аналогично до ячейки I11, в которой будет находиться формула =СУММ(A9:I9). Теперь в 12 строке проверим все столбцы, также используя диапазон ячеек. В ячейке А12 будет находиться формула =СУММ(A1:А9), в ячейке В12 будет находиться формула =СУММ(В1:В9) и так далее аналогично до ячейки I12, в которой будет находиться формула =СУММ(I1:I9).

Теперь необходимо проверить все выделенные квадраты 3х3. Следует напомнить, что для такого диапазона нужно указать адреса левой верхней и правой нижней ячеек.

То есть в ячейке А13 будет находиться формула: =СУММ(A1:С3), в ячейке В13 будет находиться формула: =СУММ(D1:F3) и т.д. И, наконец, в ячейке I13 будет находиться формула: =СУММ(G7:I9).

Так как известно, что сумма чисел от 1 до 9 равна 45, то, соответственно в диапазоне А13:I13 все ячейки должны быть равны 45, если судоку решено верно.

Теперь приступим к анализу полученных результатов. Для этого в ячейке К1 запишем следующую формулу:

=ЕСЛИ(И(A11=45; B11=45; C11=45; D11=45; E11=45; F11=45; G11=45; H11=45; I11=45; A12=45; B12=45; C12=45; D12=45; E12=45; F12=45; G12=45; H12=45; I12=45; A13=45; B13=45; C13=45; D13=45; E13=45; F13=45; G13=45; H13=45; I13=45); “МОЛОДЕЦ!”;”Попробуй еще!”).

Изначально функция ЕСЛИ выглядит так:

=ЕСЛИ(условие; если верно; если не верно).

Мы же сделали сложное условие с логической функцией И, чтобы условие было верным только в случае, если все 27 ячеек равны 45.

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

Классический вариант + дополнительное условие: по двум (главным) диагоналям все числа также должны быть различны. Для этого нам потребуется ввести к уже имеющимся еще две формулы примерно такого вида:

=СУММ(A1;B2;C3;D4;E5;F6;G7;H8;I9)

В качестве домашнего задания можно задать так называемое судоку “область”, где надо расставить цифры от 1 до 9 так, чтобы в каждой строке, в каждом столбце и в каждой выделенной области из 9 клеток все цифры были различны. Можно просто раздать рисунки и попросить написать к ним формулы, даже не используя компьютер.

Заполненные справа судоку служат для того, чтоб учитель мог проверить правильность написания формулы, просто введя набор цифр в ячейки Excel. (Приложение)

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

Мои ученики так увлекаются судоку, что принимают участие в чемпионате СНГ по судоку среди школьников, который проводит газета “Информатика”, издательство “Первое сентября”.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sudoku250title


Доброго времени суток!

Думаю, головоломка Судоку не нуждается в представлении. Многие из нас проводят за её решением достаточно много времени. Например, когда нужно убить время в дороге или просто поворочать мозги, чтобы не сохли. На хабре есть довольно много постов о решении головоломки. Но когда человек решает с десяток, а может и сотню головоломок, то найдётся пытливый ум, который задаст себе вопрос «А как же получается таблица Судоку, имеющая единственное решение? И как можно описать алгоритм для сетки 9x9?».

Приведённый алгоритм является вполне логичным. Но моей задачей было описание и реализация. Обо всём этом написано под катом.

  1. Цифра может появиться только один раз в каждой строчке
  2. Цифра может появиться только один раз в каждом столбике
  3. Цифра может появиться только один раз в каждом районе (Район — меньший квадрат со стороной 3х3, на изображении ниже выделен фиолетовым цветом)

Шаг 1. Взять за основу базовую сетку

Сетка должна подчинятся правилам Судоку. Размещаем в первую строку 1 2… 8 9, в строках ниже смещаем на 3 позиции влево, т.е. 4 5… 2 3 и 7 8… 5 6.
Далее переходя в следующий район по вертикали смещаем на 1 позицию влево предыдущий район.


В итоге должна получиться вот такая сетка, её я и назову базовой:

Для реализации создадим класс grid. Заполним его в соответствии с Шагом 1, в котором table — список значений таблицы, метод show — просто наглядный вывод таблицы.

Шаг 2. Перетасовать сетку

Есть несколько видов перестановок, выполнив которые таблица Судоку останется в допустимом состоянии.
К ним относятся:

Для каждой из перестановок напишем метод:

transposing
swap_rows_small
swap_colums_small

Для обмена столбцов можно поменять строки у транспонированной таблицы:

swap_rows_area
swap_colums_area

Может быть есть ещё более сложные преобразования, но, думаю, можно ограничиться этими. Этот каркас инвариантен своей структуре, такие перестановки есть почти тоже самое, что и действия над матрицами относительно определителя или вращение Кубика Рубика.

Теперь, для того чтобы получить случайную комбинацию, достаточно запустить в случайном порядке функции перемешивания. Так и поступим, amt — количество перемешиваний:

Шаг 3. Удаление клеток

После полученного решения нам необходимо получить задачу (именно в такой последовательности мы можем гарантировать однозначность решения). И это самая сложная часть. Какое количество можно убрать, чтобы гарантировать однозначность решения? Это один из важных факторов, от которого зависит сложность Судоку. Всего в Судоку 81 клетка, обычно считают лёгким когда на поле есть 30-35 «подсказок», средним — 25-30, и сложным — 20-25. Это данные большого набора реальных примеров. Нет никаких законов для сложности. Можно сделать 30-клеточный неразрешимый вариант и 22 клеточный «лёгкий».

  • Случайный подход — можно попробовать выкинуть 50-60 клеток наугад, но где вероятность что Судоку можно будет решить? Например, если заполнены 3 строки ( = 27 клеток)
  • Случайно с простым ограничением — для примера можно взять некое число N в качестве предела, так что N строк и столбцов могут быть пустыми. Принимая N = 0 — для лёгких уровней, N=1 — средний, N=2 — сложный
  1. Выбрать случайную ячейку N
  2. Отметить N просмотренной
  3. Удалить N
  4. Посчитать решения. Если оно не единственное, то вернуть N обратно

Я уверен, что есть и более сложные подходы в построении таблицы Судоку. Моя цель была достигнута, получился рабочий алгоритм. Теперь мне не нужно искать новые выпуски, я могу их генерировать :)
В принципе, здесь был приведён частный случай Судоку 9х9. Но нет ограничений для использования его на 16х16 и 25х25.

Читайте также: