Ищем правду, решаем судоку и генерируем числа подборка задач для программистов


Оглавление (нажмите, чтобы открыть):

Решение судоку на Prolog

В этой теме 1 ответ, 2 участника, последнее обновление 3 года/лет, 9 мес. назад.

Здравствуйте, у меня есть описание задачи и исходный код, помогите мне в нем разобраться:

Судоку — популярная головоломка с числами.
Игровое поле представляет собой квадрат размером 9×9, разделённый на меньшие квадраты со стороной в 3 клетки. Таким образом, всё игровое поле состоит из 81 клетки. В них уже в начале игры стоят некоторые числа (от 1 до 9), называемые подсказками. От игрока требуется заполнить свободные клетки цифрами от 1 до 9 так, чтобы в каждой строке, в каждом столбце и в каждом малом квадрате 3×3 каждая цифра встречалась бы только один раз.

Сложность судоку зависит от количества изначально заполненных клеток и от методов, которые нужно применять для её решения. Самые простые решаются дедуктивно: всегда есть хотя бы одна клетка, куда подходит только одно число. Некоторые головоломки можно решить за несколько минут, на другие можно потратить часы.

В коде используется библиотека CLPFD (Constraint Logic Programming over Finite Domains). Она подключается в первой строке с помощью команды:
:- use_module(library(clpfd)).
Используемые предикаты из библиотеки:

  1. append — Объединение списков
  2. all_distinct — Истина, если все числа в списке имеют разные значения
  3. maplist — Истина, если операция была успешно применена ко всем элементам списка
  4. transpose — Транспонирование
  5. label — Позволяет построить только одно конкретное значение в том случае, если есть более одного решения

Программа работает по следующему алгоритму:

  • Предикат Sudoku(Rows) принимает матрицу, представленную в виде набора списков (строк).
  • Строки объединяются функцией append.
  • С помощью maplist вызывается предикат all_distinct, который возвращает истину в случае, если числа в строке (элементе Rows) встречаются один раз.
  • Матрица транспонируется чтобы заменить строки столбцами, с транспонированной матрицей еще раз выполняется проверка (фактически проверятся столбцы исходной матрицы).
  • С помощью предиката blocks матрица преобразуется в блоки 3×3 и выполняется проверка уникальности чисел в блоке.
  • Снова используется maplist для вызова предиката label для строк. label гарантирует, что все числа имеют одно конкретное значение, но только в том случае, если есть более одного решения судоку

Алгоритм работы функции blocks:

  • предикат истинен, если он получает три пустых списка в качестве входных. Это точка выхода для рекурсии;
  • blocks имеет непустое значение. С помощью оператора разделения списка на голову и хвост | разбиваются данные строк в первых трех элементах и хвосте, которые используются позже;
  • имеется получился блок 3×3, включающий три элемента из каждой строки, изначально взятой из blocks в sudoku. Опять происходит проверка, что число повторяется только один раз;
  • рекурсивно обрабатывается остальная часть списков (пока не получится пустых списков).

Алгоритм решения судоку.

Игровое поле – квадрат размером 9×9, разделённый на меньшие квадраты со стороной в 3 клетки. Всё игровое поле состоит из 81 клетки. В них уже в начале игры стоят некоторые числа (от 1 до 9), называемые подсказками. Требуется заполнить свободные клетки цифрами от 1 до 9 так, чтобы в каждой строке, в каждом столбце и в каждом малом квадрате 3×3 каждая цифра встречалась бы только один раз.

Глобальные переменные.

Эти глобальные переменные доступны всем процедурам и функциям программы.

Нумерация полей.

Нумерация полей происходит при запуске программы, то есть при создании формы. Поля нумеруются в следующем порядке.

1 2 3 4 5 6 7 8 9
18 17 16 15 14 13 12 11 10
19 20 21 22 23 24 25 26 27
36 35 34 33 32 31 30 29 28
37 38 39 40 41 42 43 44 45
54 53 52 51 50 49 48 47 46
55 56 57 58 59 60 61 62 63
72 71 70 69 68 67 66 65 64
73 74 75 76 77 78 79 80 81

Заполнение массива x[i, j], где i – номер столбца, а j – номер строки. 0 ≤ i ≤ 8; 0 ≤ j ≤ 8;

Заполнение двумерного массива m[k, mc[k]].

Для каждого поля, имеющего номер k = x[i, j], 1≤k≤81 , находящегося в столбцe i и строке j, находятся 20 полей m[k, mc[k]], где 1≤ mc[k] ≤20, каждое из которых находится в столбцe i0 и строке j0. Каждое из этих 20 полей находится либо в той же самой строке, либо в том же самом столбце, либо в том же самом блоке размера 3×3, что и поле k.

Для этого в цикле, где i меняется от 1 до 8, j меняется от 0 до 8, i0 меняется от 0 до 8, j0 меняется от 0 до 8, для двух номеров полей x[i, j] и x[i0, j0] , если их номера столбцов совпадают, и при этом их номера строк не совпадают; или их номера строк совадают, и при этом их номера столбцов не совпадают; или их номера стобцов не совпадают, и их номера строк не совпадают, и при этом они принадлежат одной и той же ячейке размера 3×3, что означает равноство целочисленного делания на 3 номера строки и номера столбца, то mc[x[i, j]] увеличивается на единицу, а x[i0, j0] записывается в массив m[x[i, j], mc[x[i, j]], соостветствующее номеру k=x[i, j]. В конце этой процедуры для любого k, 1≤k≤81, все значения mc[k]=20, и для каждого поля k, 1≤k≤81, будет найдено 20 полей m[k,L], 1≤L≤20, для которых либо номер столбца m[k, L] совпадает с номером столбца поля k, а номер строки m[k,L] не совпадает с номером строки поля k; либо номер строки m[k,L] совпадает с номером строки поля k, а номер столбца m[k,L] не совпадает с номером столбца поля k; либо номер столбца m[k,L] не совпадает с номером столбца поля k, номер строки m[k,L] не совпадает с номером строки поля k, а частное от целосчиленного деления на 3 номера столбца m[k,L] совпадает с частным от целочисленного деления на 3 номера стоблца k, и частное от целосчиленного деления на 3 номера строки m[k,L] совпадает с частным от целочисленного деления на 3 номера строки k.

j0)) or ((i <> i0) and (j = j0)) or ((i <> i0) and (j <>j0) and (i div 3 = i0 div 3) and (j div 3 = j0 div 3)), то < mc[x[i, j]] := mc[x[i, j]]+1; m[x[i, j], mc[x[i, j]]] := x[i0, j0]; >» height=1158 w >

Ввод исходных данных. Заполнение глобальных массивов z[k, 0], s[k], p[k], 1≤k≤81

В ячейке z[k,0] будет храниться исходная задача. Если поле c номером k пустое, то в z[k,0] записывается нуль, а если в этом поле есть цифра, то в z[k,0] записывается эта цифра. Затем элементам массива s[k] присваивается значение z[k,0].

Логический массив p[k] заполняется следующим образом: если поле c номером k пустое, то p[k] присваивается значение false, а если оно не пустое, то p[k] присваивается значение true. В следующих рекурсивных функциях значение s[k] не будет меняться для тех полей, для которых p[k]=true.

Если выбрана опция «Перебор всех цифр», то значение переменной frugal присваиваеися значение . Если выбрана опция «Поиск одиночек», то переменной frugal присваивается значение 1. Если выбрана опция «Поиск скрытых одиночек», то переменной frugal присваивается значение 2.

Проверка судоку на наличие ошибок.

Функция control проверяет, нет ли двух одинаковых цифр, отличных от нуля, в строке, столбце или блоке 3×3. Если таких цифр нет, то значение функции true, а если в какой либо строке, столбце или блоке 3×3 найдeтся две одинаковые цифры, то значение функции равно false.

Присваивается значение локальной переменной q := true; для всех полей k с номерами от 1 до 81, и для всех mc[k]=20 полей, находящихся с полем k в том же столбце или в той же строке или в том же блоке 3×3, если цифры совпадают и отличны от нуля, то q := false. Функции control присваивается значение локальной переменной q.

Рекурсивная процедура неэкономного решения судоку.

Процедура rec(k, g) вызывается тогда, когда флажок «Экономно» на форме снят. Рекурсивная процедура rec(k, g) ставит в поле с номером k цифру t, которой нет ни в в одном из 20 полей, имеющих с полем k либо тот же самый номер столбца, либо тот же самый номер строки, либо тот же самый блок размером 3×3. Процедура имеет два параметра. Параметр k – это номер поля, в который ставится цифра. Параметр g – это количество решений, которые надо найти.

Если в начале поле с номером k было непустым, то цифра, стоящая в нём, не может быть изменена, p[k] = true. В этом случае происходит переход к следующему полю с номером k+1, то есть происходит вызов рекурсивной процедуры с параметрамиrec(k+1, g).

Если в начале поле с номером k было пустым, то есть p[k] = false, то для поля с номером k ищется какая либо цифра от 1 до 9, которой нет в 20 полях, имеющих с полем k либо тот же самый номер столбца, либо тот же самый номер строки, либо тот же самый блок размером 3×3. Если найдётся такая цифра t, то она ставится в поле с номером k, то есть s[k] присваивается значение t; число ходов c увеличивается на единицу; после этого происходит переход к следующему полю с номером k+1, то есть происходит вызов рекурсивной процедуры rec(k+1, g). Если все 9 цифр перебраны, и ни одну цифру нельзя поставить в поле k, так как каждая цифра стоит хотя бы в одном из 20 полей, имеющих с полем k либо тот же самый номер столбца, либо тот же самый номер строки, либо тот же самый блок размером 3×3, то в поле с номером k ставится , то есть s[k] присваивается нулевое значение. Этот процес продолжается до тех пор, пока номер поля не провосходит количества полей то есть k≤81, пока количество найденных решений u меньше заданного в качетсве второго параметра процедуры значения g, и пока польозватель не нажмёт кнопку «Стоп».

Как только будет вызвана процедура rec(k, g) с номером k=82, превышающим количество полей, количество решений u увеличивается на единицу, в массив z[k, u] записывается решение s[k], то есть для всех полей с номером k от 1 до 81 элементу массива z[k, u] присваивается значение s[k].

На решение судоку уходит иногда до 5 секунд. Но если судоку решений не имеет, и при этом снят флажок «Экономно», то поиск решения неэкономным методом перебора может продолжаться очень много часов, и поэтому активирована кнопка «Стоп» Процедура Application.ProcessMessages; в Лазарусе предотвращает зависание программы.

Подготовка к экономному решению судоку.

Процедура possible для каждого поля с номером k определяет, какое число w[k] возможных цифр может быть поставлено в каждое такое поле с номером k, и записывает все эти цифры в массив b[k, j], где второй индекс j пробегает значения от 1 до w[k].

Если для какого то поля с номером k значение w[k]=0, то эта судоку не имеет решений, локальной переменной det присваивается значение false. Если для какого то поля с номером k значение w[k]=1, то в это поле с номером k ставится данная единственно возможная цифра, то есть значению s[k] присваивается значение b[k, 1] , после чего функция ingress повторно проверяет все поля с номерами k от 1 до 81 (переменной rep присваивается значение true). Цикл звершается тогда, когда либо для какого-то поля k количество возможных цифр оказалось нулевым, то есть w[k] = 0, и судоку решений не имеет; либо когда для всех полей с номерами k от 1 до 81 значение w[k]>1 (при этом значение переменной rep равно false).

Процедура possible, таким образом, находит всех кандидатов для каждой пустой ячейки c номером k, записывает их в массив b[k, j], а количество этих кандидатов записывает в массив w[k]. После этого в таблице отыскиваются всен одиночки, т.е. ячейки, в которых возможна только одна цифра и никакая другая, то есть находятсмя все такие ячейки, для которых w[k]=1. В эти ячейки записывается данный единственный кандидат b[k, 1].

Поиск скрытых одиночек.

Если в ячейке стоит несколько кандидатов, но один из них не встречается больше ни в одной другой ячейке данного блока или столбца или строки, то такой кандидат называется «скрытой одиночкой». Функция ingress выявляет последовательно всех «скрытых одиночек», записывает их в соответствующие ячейки и после этого снова вызывает процедуру possible, которая снова создаёт массив кандидатов для оставшихся пустых ячеек.

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

В начале ищутся «скрытые одиночки», равные цифре t в каждом блоке с номером от 0 до 8, где номер блока равен li+3*lj, а li – частное от целочисленного деления на 3 номера столбца i, а lj – частное от целочисленного деления на 3 номера строки j.

Массив onel[li+3*lj, t] будет содержать количество кандидатов, равных цифре t и содержащихся в блоке с номером li+3*lj.

Если для какого-то блока onel[li+3*lj, t] = 1, то находится ячейка, стоящая в столбце с номером i и в строке с номерм j, в которой есть цифра t, и если эта ячейка пустая, то в неё записывается цифра t, а счётчик cp записанных предварительно цифр увеличивается на 1.

После этого проверяется, нет ли среди девяти блоков с номероами от 0 до 8 такого блока с номером onel[li+3*lj, t], для которого для какой-то цифры t значение onel[li+3*lj, t] = 0. Если такой блок найдётся, то судоку решений не имеет, переменной det присваивается значение false, управление передаётся на метку ending, и функция завершает работу с результатом false

После этого ищутся «скрытые одиночки», равные цифре t в каждом столбце i с номером от 0 до 8. Массив onei[i, t] будет содержать количество кандидатов, равных цифре t и содержащихся в столбце с номером i.

Если для какого-то столбца с номером i значение onei[i, t] = 1, то находится ячейка, находящаяся в строке с номером j, в которой есть цифра t, и если эта ячейка пустая, то в неё записывается цифра t, а счётчик cp записанных предварительно цифр увеличивается на 1.

После этого проверяется, нет ли среди девяти столбцов с номероами от 0 до 8 такого столбца с номером i, для которого для какой-то цифры t значение onei[i, t] = 0. Если такой столбец найдётся, то судоку решений не имеет, переменной det присваивается значение false, управление передаётся на метку ending, и функция завершает работу с результатом false

После этого ищутся «скрытые одиночки», равные цифре t в каждой строке j с номером от 0 до 8. Массив onej[j, t] будет содержать количество кандидатов, равных цифре t и содержащихся в строке с номером j.

Если для какой-то строки с номером j значение onej[j, t] = 1, то находится ячейка, находящаяся в столбце с номером ш, в которой есть цифра t, и если эта ячейка пустая, то в неё записывается цифра t, а счётчик cp записанных предварительно цифр увеличивается на 1.

После этого проверяется, нет ли среди девяти строк с номероами от 0 до 8 такой строки с номером j, для которой для какой-то цифры t значение onej[j, t] = 0. Если такая строка найдётся, то судоку решений не имеет, переменной det присваивается значение false, управление передаётся на метку ending, и функция завершает работу с результатом false

после всякой записи в пустую ячейку цифры переменной rep присваивается значение true, что означает то, что цикл будет повторен, будет неайдены сначала все кандидаты для каждой ячейки при помощи процедуры possible, при помощи той же процедуры possible ищутся и записываются в пустые ячейки « одиночки», а затем ищутся «скрытые одиночки» функцией ingress. Цикл завершится либо тогда, когда не останется «скрытых одиночек», либо тогда, когда найдётся блок или строка или столбец, в которые нельзя поставить какую-то из девяти цифр.

Рекурсивная процедура экономного решения судоку.

Рекурсивная процедура экономного решения судоку recfrugal(k, g) работает точно так же, как процедура неэкономного решения судоку rec(k, g), но только для каждого поля перебираются не все цифры от 1 до 9, а только возможные для каждого поля цифры из массива b[k, j], где j = w[k] больше 1.

Решение Судоку

Судоку решатель позволит Вам ввести любую решетку судоку, с которой Вы испытываете затруднения или просто хотите проверить, правильно ли Вы ее решили. Можете ввести решетку, которую Вы увидели в своем любимом журнале, газете или на другом сайте, не предоставляющем возможность решения решеток судоку. Введите цифры в судоку, которое хотите решить, затем нажмите «Решить». Решение Вашей судоку головоломки будет показано мгновенно в большинстве случаев, но есть и такие решетки, с которыми будет необходимо подождать несколько секунд до того, как решение будет показано.

Как реализовать нейронную сеть для судоку

Здравствуйте, скажите пожалуйста, как и какую (какого типа) сделать нейронную сеть для решения судоку?

Мастер Йода рекомендует:  Избегайте SEO-штрафов

Какие есть процедуры и методы в программе :

  • NeuroGen — создаёт перцептрон (кстати, пойдёт для такой задачи обычный перцептрон?)
  • NeuroGen.fill — забивает весы случайными значениями
  • Game.MapGen — создаёт поле, а точнее массив из массива чисел, вида :
  • Game.InsertIN(x,y,number) — вставляет число в клетку по координатам X и Y, возвращает false если была попытка вставить число в сгенерированную клетку.

Пару слов про Нейронную Сеть :

  • Обучаться по идее должна с помощью генетического алгоритма
  • Допустимые значения весов от 0 до 1

Ну вот сама программа (только алгоритм):

  1. Я делаю структуру, а точнее обычный перцептрон
  2. На весах генерирую различные значения от 0..1
  3. Затем запускаю игру, ну а точнее в этой же программе генерирую поле с помощью процедуры mapgen (сразу же с пустыми клетками)

А дальше я не могу даже представить как заставить ходить мою НС, чтобы она обучалась и ходила сама основываясь на своём опыте.

В моей НС есть несколько входных слоёв, ну и вот какие мне подавать данные на вход и в каком формате, по сути я же должен подать окружающую среду (карту) и в конце цикла на выходном слое получить действие (позицию клетки и цифру какую надо ставить)?

И ещё, как подавать, пошагово? Тоесть клетека вставилась, НС отработала первый цикл, потом НС вставила в какую нибудь клетку цифру и до тех пор пока не останется пустых клеток, так вот и после того как она проиграет несколько игр, она же должна по идее скрестить те игры, у которых было меньше всего ошибок, правильно? Ну тогда как хранить данные, чтобы их можно было скрещивать?

И ещё, вот например мой алгоритм научиться играть на этой карте, а на других он сможет выигрывать?

СУДОКУ
ОНЛАЙН

кроссворд сканворд

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

Как создать свою Судоку?

В нашем Конструкторе Судоку Вы можете создать свою собственную Судоку, а потом распечатать её на бумагу, или просто решить понравившуюся Вам Судоку в любимом журнале. Также можно смоделировать определенные ситуации на полях Судоку, чтобы потом «отработать» варианты их решения.

Напомним Вам правила генерации Судоку. Судоку состоит из цифр от 1 до 9. Все числа на полях Судоку заполняются таким образом, чтобы ряды, столбцы, а также квадраты 3х3 — были заполнены исключительно неповторяющимися числами. При этом часть цифр открываются с самого начала, а оставшуюся часть цифр скрывают, их необходимо будет определить самостоятельно методом математических вычислений и интерполяций. В этом и состоит суть игры. Чем меньше цифр открывается с самого начала, тем сложнее считается Судоку.

Чтобы внести новое число в Судоку — необходимо «щелкнуть» мышкой на интересующую Вас цифру в меню чисел, после чего, выбранная цифра появится в правом окошечке. Чтобы потом перенести выбранную цифру в Судоку, необходимо «кликнуть» мышкой по соответствующему полю. В верхнем меню чисел, расположены цифры, которые будут открыты с самого начала игры, а в нижнем меню, соответственно, расположены цифры, которые нужно использовать при непосредственном разгадывании Судоку.

Для удаления введенного Вами ранее числа, необходимо выбрать пустую клеточку в меню цифр, и внести её вместо числа, которое нужно удалить. А для корректирования числа — необходимо выбрать новое число, и внести его вместо старой цифры. Для того, чтобы распечатать сгенерированную вами Судоку – воспользуйтесь встроенной функцией печати.

Как разгадывать классические судоку любой сложности

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

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

Терминология судоку

  • Клетка. Основной элемент судоку. Все клетки должны быть заполнены цифрами от 1 до 9. Каждая из клеток входит одновременно в ряд, колонку и область.
  • Группа. Групп несколько: ряд — 9 горизонтальных клеток; колонка — 9 вертикальных клеток; область — малый квадрат размером 3×3 клетки. В каждом судоку 9 областей.
  • Сегмент. Часть области — 3 горизонтальных или вертикальных клетки. В каждой области 6 сегментов — частей большого ряда или колонки.
  • Кандидаты. Цифры, которые могут быть вписаны в клетку (на рисунке — мелким шрифтом). Когда все кандидаты, кроме одного, вычеркнуты, цифру можно вносить «на постоянной основе». Два кандидата — пара, три — трио, четыре — квартет.

Способы решения судоку

За годы существования судоку было разработано множество подходов к решению. Мы предлагаем несколько методов, от простого — к сложному.

1. Синглы (единственные варианты)

Синглы определяются после исключения цифр, которые уже вписаны в ряды, колонки или области. Таким способом решают простые судоку.

1.1. Очевидные синглы

Если путем исключения можно выявить единственно возможное число, сингл называют очевидным.

  • Цифры 1, 5, 6, 9 исключены — они есть в ряду.
  • 2, 3, 8 — расположены в колонке.
  • 6, 7, 8 — могут присутствовать в области.
  • Единственным кандидатом в клетке E6 остается 4.

1.2. Скрытые синглы

Число можно вписать в клетку, если другое расположение в группе невозможно. Определить такую вероятность можно после расстановки кандидатов и выявления цифры, которая больше нигде не повторяется.

  • В седьмом и девятом ряду 8 вписана изначально.
  • 8 есть в колонке А.
  • В нижней левой области вписать 8 можно только в одну клетку — B8, поэтому остальных кандидатов нужно исключить.

2. Исключение кандидатов

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

2.1. Сегмент 1

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

В правой верхней области 6 должно находиться в сегментах G1 или H1 (других вариантов нет — второй ряд и третья колонка заняты), поэтому цифру можно исключит из кандидатов для клетки С1.

2.2. Сегмент 2

Если число может находиться только в одной области, его нужно исключить из кандидатов в других клетках.

  • Число 2 можно вписать в третий ряд второй области — D3 или E3. Поэтому 2 можно исключить из кандидатов в клетки первого и второго ряда этой области.
  • С учетом уже назначенных чисел третьего ряда, а также колонок B и H, число 2 может находиться только во второй области в третьем ряду и его можно исключить из D1, E1, E2 и F2.

3. Группы кандидатов

3.1. Очевидные группы кандидатов

Если в группе кандидатов есть две клетки с одинаковыми парами, эти кандидаты не могут находиться в других клетках ряда, колонки или области.

  • Пара 1/4 (второй ряд) повторяется в клетках G2 и H2. Один из кандидатов обязательно расположится в G2, другой — в H2. Это значит, что 1 и 4 можно исключить из остальных клеток ряда.
  • Также пару 1/4 можно исключить из других клеток области.
  • В трех клетках группы не содержатся другие кандидаты, кроме трех, значит эти числа могут быть исключены из остальных клеток группы.

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

Во втором ряду в клетках A, С и G имеется трио 1, 4, 6, значит, данные клетки обязательно разместят одну из этих цифр. Следовательно, 1, 4, 6 не могут занимать другое место в ряду, их присутствие можно исключить.

С квартетом дела обстоят аналогично — если четыре клетки содержат одинаковый квартет (даже в неполном составе), эти числа исключаются из других клеток группы.

Это правило распространяется на любой по численности набор кандидатов — вероятность расположения цифр в других клетках можно исключить.

Очевидные группы кандидатов позволяют исключить кандидатов из других клеток группы.

3.2. Скрытые группы кандидатов

Если несколько клеток содержат общие числа, которые не встречаются в других клетках группы, остальные кандидаты для этих клеток могут быть исключены.

В клетках A и C встречается пара 4/6. Таким образом, остальных кандидатов из этих двух клеток можно исключить — в одной из клеток обязательно разместится 4, в другой 6.

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

4. Сложные методы


Сложность этих методов относится не к пониманию их сути, а к применению в решении судоку.

4.1. Связанные пары (бабочка)

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

В переносе на колонки метод формулируется аналогично, но тогда нужно исключить кандидатов в рядах.

Например, цифра 9 для колонок B и H может находиться только во втором и восьмом рядах (фиолетовые клетки). Из остальных клеток этих рядов 9 можно исключить.

Рассмотрим колонку B. Если 9 не в B2, она может быть только в B8, для колонки H — наоборот. То есть, варианты расположения 9: B2 и H8 или B8 и H2, из остальных клеток этих рядов девятку можно исключить. Метод применим и к областям.

Этот метод может применяться к областям:

  • В колонках B и C цифра 9 может находиться в ячейках B3, B9, C2 и C8.
  • Поскольку B3 и C2, B9 и C8 находятся внутри одной области, 9 может быть исключена из остальных клеток этих двух областей.

4.2. Сложносвязанные пары (рыба)

Метод похож на предыдущий, но сложнее. Его применяют, когда один из кандидатов присутствует в трех рядах (не более) и при этом — в одних и тех же трех колонках.

Из остальных рядов этих трех колонок кандидата можно исключить. Аналогично метод применяется к трем колонкам, тогда кандидаты исключаются из рядов:

2 встречается только в двух клетках колонок C, F и H. Эти клетки находятся в трех рядах — втором, четвертом и восьмом:

  • Второй ряд. 2 может быть только в F2 или в H2,
  • Четвертый ряд: C4 или H4.
  • Восьмой ряд: C8 или F8.

Из остальных клеток этих рядов 2 можно исключить.

4.3. Связанные кандидаты

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

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

  • В колонке B число 7 может находиться B2 или B4.
  • Аналогично в первом ряду C1 и H1 — если один кандидат верен, то другой нет.
  • Эти связи кандидатов объединены в первой области.
  • Если 7 находится в B4, ее можно исключить из H1. Если она не в B4, тогда в B2. Если не находится в C1, тогда в H1, но не в H7.
  • В любом случае 7 не может находиться в H1.

4.4. Цепочки

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

Если при выборе другого кандидата в начальной клетке вы приходите к удалению того же кандидата, он может быть удален.

Например, если 3 верно в клетке B2, то выполняется цепочка заключений (красная линия):

B2 — 3, D2 — 5, E3 — 7, E5 — 8, A5 — 5, таким образом 5 не находится в A4.

Если же в B2 находится 2, тогда мы имеем (зеленая линия):

B2 — 2, B4 — 5 и опять 5 не находится в A4.

В любом случае кандидат 5 может быть исключен из клетки A4.

5. Предположения

Иногда вышеперечисленные методы не помогают продвинуться в решении. Тогда можно выбрать кандидата в клетке и посмотреть, к чему приведет такой выбор. Если рассуждения заканчиваются тупиком, тогда придется вернуться в начало и попробовать другой вариант.

Этот метод ближе к гаданию на кофейной гуще и обычно не используется при решении судоку.

Ищем правду, решаем судоку и генерируем числа: подборка задач для программистов

Формулировка задания: “Написать программу для решения судоку”

Выбранный язык программирования: С++.

Поле судоку представляет собой таблицу 9х9 клеток. В каждую клетку заносится цифра от 1 до 9. Цель игры: расположить цифры таким образом, чтобы в каждой строке, в каждом столбце и в каждом блоке 3х3 не было повторений. Другими словами, в каждом столбце, строке и блоке должны быть все цифры от 1 до 9.

Существует множество подходов к решению задачи судоку.

Как решать простые судоку?

Рассмотрим на конкретном примере как разгадывать судоку. Игровое поле на картинке представляет собой относительно простой вариант игры. Правила игры судоку для простых сводятся к выявлению зависимостей в горизонтальной и вертикальной плоскости и в отдельных квадратах.

Например, в центральной вертикали не хватает цифр 3, 4, 5. Четверка не может находиться в нижнем квадрате, так как в нем уже присутствует. Также можно исключить пустую центральную клетку, так как мы видим 4 в горизонтальной линии. Из этого делаем вывод, что она располагается в верхнем квадрате. Аналогично можем проставить 3 и 5 и получить следующий результат.

Проведя линии в верхнем среднем малом квадрате 3х3 можно исключить ячейки, в которых не может находиться цифра 3.

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

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

Как решать сложные судоку?

Многие задаются вопросом, как решать судоку, есть ли стандартные методы и стратегия. Как и в любой логической головоломке есть. Самый простой из них мы рассмотрели. Чтобы перейти на более высокий уровень, необходимо иметь больший запас времени, усидчивость, терпение. Для решения головоломки придется делать предположения и, возможно, получать неверный результат, возвращающий к месту выбора. Рассмотрим несколько популярных методик, применяемых профессиональными «судокуведами» на следующем примере.

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

Ответ, как решить судоку сложные для каждого свой. Кому-то удобнее использовать разные цвета для окрашивания ячеек или цифр, кто то предпочитает черно-белый вариант. На рисунке видно, что нет ни одной ячейки, в которой бы стояла единственная цифра, однако, это не говорит о том, что в данном задании нет одиночек. Вооружившись правилами судоку и внимательным взглядом, можно увидеть, что в верхней строке среднего малого блока стоит цифра 5, которая встречается единожды в своей линии. В связи с этим можно смело проставить ее и исключить из ячеек, окрашенных в зеленый цвет. Данное действие повлечет за собой возможность проставить цифру 3 в оранжевой клетке и смело вычеркнуть ее из соответствующик фиолетовых по вертикали и малом блоке 3х3.

Таким же образом проверяем остальные клеточки и проставляем единицы в обведенных клетках, так как они также являются единственными в своих строках. Чтобы разобраться, как решать судоку сложные, необходимо вооружиться несколькими простыми методами.

Метод «Открытые пары»

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

Из выделенных зеленым ячеек можно удалить значения синих и тем самым сократить количество вариантов. При этом располагающаяся в первой строке комбинация 1249 называется по аналогии «открытой четверкой». Также можно встретить «открытые тройки». Такие действия влекут за собой появление других открытых пар, например 1 и 2 в верхней строке, которые также дают возможность сузить круг комбинаций. Параллельно проставляем в обведенной ячейке первого квадрата 7, так как пятерка в данной строке в любом случае будет располагаться в нижнем блоке.

Метод «Скрытые пары/тройки/четверки»

Данный метод является противоположным к открытым комбинациям. Его суть заключается в том, что необходимо найти ячейки, в которых повторяются цифры в рамках квадрата/строки, не встречающиеся в других клеточках. Как это поможет разгадывать судоку? Прием позволяет вычеркнуть остальные цифры, так как они служат фоном и не могут быть проставлены в выбранные клетки. Данная стратегия имеет несколько других названий, например «Ячейка не резиновая», «Тайное становится явным». Сами имена объясняют суть метода и соответствие правилу, говорящему о возможности проставить единственную цифру. Примером могут служить окрашенные в голубой цвет клетки. Цифры 4 и 7 встречаются исключительно в этих ячейках, поэтому остальные можно смело удалить.

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

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

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

В результате каждого действия количество вариантов в ячейках сокращается и решение сводится к методу «Одиночка». Этот процесс можно назвать сокращением и выделить в отдельный метод, так как он предполагает тщательный анализ всех строк, столбцов и малых квадратов с последовательным исключением вариантов. В итоге мы приходим к единственному решению.

Рекурсивный алгоритм решения

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

После определения возможных значений, алгоритм рекурсивно подставляет поочереди данные значения в соответствующие клетки и проверяет с помощью метода «Одиночка». Выход из рекурсии — ситуация, когда не осталось пустых клеток.

В программе будет использовать именно такой алгоритм. Он позволяет быстро решать судоку размерностью 9х9 и относительно прост в реализации.

Судоку — NP-полная задача

В общем случае судоку размерностью N^2 x N^2 является NP-полной задачей.

Известно, что задача распознавания того, может ли частичный квадрат быть дополнен до латинского, является NP-полной. Предположим, что квадрат заполнен так:

Если перенести каждый столбец квадрата в начало столбцов матрицы 16х16, а затем заполнить оставшиеся ячейки матрицы полностью, получится задача о решении судоку.

Следовательно, задача о решении судоку — NP-полная. Значит, для нее не существует полиномиального алгоритма.

В качестве контейнера для хранения судоку используется двухмерный std::deque целых числел. Он удобен тем, что позволяет легко производить последовательный обход матрицы и имеет сложность добавления О(1). Для работы алгоритмов проверки ряда, столбца и квадрата3х3 используются контейнеры std::set , а в методе, который проверяет одну ячейку с помощью вышеупомянтых — std::unordered_set , так как добавление в него происходит за константное время, в отличие от логарифмического в std::set . Следовательно, при использовании именно таких контейнеров достигается самая быстрая работа программы, что демонстрируют замеры времени работы программы:

В двух заголовочный файлах описан класс Sudoku . Файл sudoku.hpp описывает интерфейс класса, а в файле sudoku.h хранится реализация. Класс имеет публичный конструктор, функцию решения и печати судоку в файл. Остальные поля класса — приватные. Программа компилируется и запускается из командной строки. В одной директории с программой должна находиться папка tests, в которой хранится файл с матрицей, описывающей судоку в формате целых чисел от 1 до 9 или -1, если клетка должна быть пустой, записанных через пробел. Для того, чтобы запустить программу, в терминале нужно выполнить команду ./compiled_program_file_name 1 additional_file_name . Входные файлы для программы должны называться input_additional_file_name.dat , где additional_file_name — любая строка без пробелов. Выходные файлы будут иметь название в формате output_additional_file_name.ans . Программа неинтерактивная, пользовательский ввод не предусмотрен.

Тесты empty и not_dig(здесь и далее приводятся только additional_file_name вместо полного названия файлов) — это тесты корректности вводимой информации:

  • empty — пустой файл
  • not_dig — файл, который внутри матрицы содержит не только числа

Во всех случаях выбрасывается исключение, выходной файл не создается.

  • Easy, medium, another_medium, hard — судоку различной сложности.
  • Hard_1 показывает, что программа имеет возможность решить судоку, имеющую более одного правильного решения(выводится первый корректный вариант). Hard_1 — это файл hard, в котором вместо одного из значений судоку — пустая ячейка. При решении получается другой, правильный вариант решения. Следовательно, у данной задачи(hard_1) — два решения и программа позволяет решить ее.
  • Too_easy — пустой судоку.

Оценка сложности алгоритмов

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

Каждый из методов проверки (строки, столбца и квадрата) проходит по N элементам и добавляет элементы в std::unordered_set за O(1), следовательно, сложность каждого из трех методов O(N). Функция проверки клетки XY использует последовательно три вышеупомянутых метода, каждый из которых имеет сложность NlogN, а затем производит проверку наличия цифры в std::unordered_set за O(1) и добавляет элементы в std::unordered_set . Для N элементов добавление будет иметь сложность N. Следовательно, сложность данной функции O(N).

Методы проверки одиночных цифр для строк, столбцов и квадратов 3х3 в возможных значениях ячейки обходят весь судоку и для каждой пустой ячейки запоминают возможные варианты, проверка производится вышеописанной функцией за O(N). Работа с std::unordered_map производится за константное время. Далее, если есть уникальные варианты, они записывается в соответствующие ячейки. Следовательно, верхняя оценка сложности составляет O(N^3).

Оценка использования памяти

Каждый из способов проверки (строки, столбца и квадрата) требует N объектов для хранения. Значит функция проверки клетки XY требует места для хранения 3N промежуточных и N итоговых объектов.

Блог Захарова Андрея

Блог о программировании, установке и настройке WordPress, плагинов, LiveStreet, IPB 3, Nginx, MySql, CentOS

Подпишись! RSS на Email

Генератор судоку на JavaScript (6 строк)

На этой недели Хабрахабр будоражили различные поделки в 30 строчек на JavaScript. Чего только не было. Выкладывали гонки, аркады, космические стрелялки, змейки, тетрис, пианино и многое другое. И если сказать честно, то продолжаю публиковать в песочницу до сих пор. Я слишком поздно предложил свою поделку и она не попала в список тех, которые увидят многие. Может оно и к лучшему, т.к. я смог еще лучше оптимизировать код.

Особенностью реализации является:

  • небольшой код (6 строк)
  • 2 строчки HTML-кода
  • 2 строчки CSS
  • возможность разгадывать судоку вводя цифры в свободные поля
  • реализована проверка вводимых данных и фильтрация разрешающая вносить только цифры

Выглядит это вот так:

Пример работы скрипта «Генератор судоку на JavaScript (6 строк)»

Генерация основывается на задействовании уже составленного шаблона и замещении его элемента случайными числами. Шаблон задаеся так:

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

Числа для замещения хранятся в массиве, который формируется следующим образом:

К сожалению в javaScript нет php функции и поэтому пришлось реализовать перемешивание подобным образом. Можно было использовать другой вариант, тогда случайность была бы более случайной (См. javascript shuffle array). Но для данного примера решил ограничиться такой реализацией.

Случайным образом формирую строку для вывода используя за основу известную цифру или ячейку для ввода.

var st = (Math.random()*10>6) ? ‘

‘ : ‘

‘;

Приведу весь код целиком:

А вот и рабочий вариант: судоку

Если возникнут вопросы, то с удовольствием отвечу на них в комментариях.

Комментарии

Генерирует повторяющиеся цифры в поле 3х3.

Ошибка в статье (поправил), а в рабочем примере все отлично.

1. можете написать данный алгоритм на php? без html
обычно генераторы возвращают сроку вида
032100005454000000003453453000045455000350005454 ��

2. я принцип вашего алгоритма не совсем понял. откуда взялся шаблон ? почему ноль впереди ? можете объяснить пожалуйста подробнее ?

100 Задач по программированию

Воспользуйтесь шаблоном
прямо сейчас!

Россия, Москва
28 лет

Описание

Сможешь бросить сам себе такой вызов?

В этом шаблоне собрано целых 100 задач по программированию от самых азов, до создания 3хмерных моделей анимации и взаимодействия. Если выполнить всё, что здесь указано (все задания) то можно стать одним из лучших разработчиков, так как тут собраны задачи которые далеко не каждому под силу.

Есть ли тут обучающий материал?

Нет. И не будет. Ты сам должен будешь выбрать свой Язык программирования и на нем осваивать всё с основ до сложных операций. Если у тебя нету своего ЯП, рекомендую выбрать опираясь на рейтинг языков программирования в интернете. Как только выберешь — изучи основы по нему и берись приступать выполнять задания.

Как выполнять задания, если я не знаю как?

У тебя нету интернета? Бери под руку интернет и начинай гуглить его вопросами. Окей гугл, как сделать то; окей гугл, как сделать это. И так далее. Всё делается по шаблонам, в данном вызове нету готовых инструкций, так как он учит самостоятельности. Ты должен сам научиться решать сложные задачи, которые перед собой ДО ТЕБЯ никто не ставил. Именно так рождаются уникальные разработчики чего-либо.

Я готов! Что мне делать?

Прочти описание (оно чуть-чуть ниже), ознакомься с задачами. Если тебя всё устраивает, то нажимай кнопку «установить шаблон», ставь его себе (как цель). Отредактируй, запихнув в категорию программистов и добавив пару штрихов (на своё усмотрение). По возможности оставь ссылку на этот шаблон (она встроена в описание). Что дальше? Приступай. Решай задачи и самосовершенствуйся.

Сколько стоит шаблон?

Он бесплатный. Мне не жалко.

Как отблагодарить?
Хотя бы про себя скажи «спасибо», этого будет вполне предостаточно 😉

Ну, или если сможешь, выполни этот вызов.

На создание шаблона ушло: 3 дня.

Версия шаблона: 1.0.0 (стартовая).

Описание, которое станет доступно после установки шаблона:

Я принял вызов!

Суть вызова:

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

Задания:

Всего в вызове 100 заданий, которые нужно выполнить. Все они разложены по этапам.

ВАЖНО: Перед тем как браться за задачи, освойте следующее:

  • Выберите свой язык программирования, на котором вы будете писать.
  • Выберите программу на которой будете заниматься разработками.
  • Изучите основы своего языка (можно во время выполнения задач).
  • Изучите что такое ООП (на 2 этапе), научитесь пользоваться классами.
  • Изучите создание библиотек классов (dll) перед 5 этапом.

Правила:

Чтобы всё правильно сделать и не ошибиться, стоит следовать простым и незаурядным правилам:

  1. Не спешите! Даже если вы в себе уверены, перед каждой задачей настраивайтесь!
  2. Не халтурьте. Старайтесь делать всё красиво, так, как будто вы делаете это для кого-то важного.
  3. Не зазнавайтесь. Если вы не уверены, что сможете такое разработать, упрощайте для себя задачу.
  4. Не тупите. Если вы застряли на каком-то этапе, выполняйте задачу заного, значительно упрощая её.
  5. Не тужтесь. Если вам не нравится задача, не заставляйте себя. Придумайте аналогичную и выполните её.


Этапы выполнения заданий:

Этап 1. Я консольщик.

На этом этапе из 10 задач, вашей, будет являться изучение работы с консолью и все десять приложений обязательно должны быть исполнены в консоли. Если вы новичок, не спешите, отводите на каждую задачу минимум день (чтобы освоиться и закрепить всё в своей голове). Если вы профи — можете сделать всё за раз в одной программе (только в том случае, если уверены в себе).

Этап 2. Мастер оконной разработки.

Второй этап посвящен изучение оконной разработки. В зависимости от того, какое IDE вы выбрали, какой путь оконной разработки вы выбрали, определите для себя свою ключевую задачу — освоить основные элементы разработки оконных приложений. На этом этапе ознакомьтесь с особенностями оконной разработки.

Этап 3. Различные задачки.

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

Между-этап. Гексагон.

Вы знаете о гексагонах? Почитайте в интернете. Интерфейс таких программ весьма сложен, но очень красив и своеобразен. Сумеете ли вы освоить разработку на уровне гексагонов? Постарайтесь выработать свой алгоритм разработки гексагонов.

Этап 4. Игры для компаний.

Дано 9 различных задач для приложения, которое может пригодиться практически в любой заскучавшей компании (как повод развеется), вам нужно решить данные задачи через программирование, разработав 9 соответствующих программ. Постарайтесь адаптировать программы так, чтобы их действительно было интересно использовать в компании (чем сможете как раз похвастаться перед друзьями).

Этап 5. Разработчик игр.

В этом этапе собрано аж 30 задач разного характера по разработке различных игр со своей собственной внутри игровой логикой. На этом этапе придется попотеть и он считается первым самым сложным этапом. На этом этапе вам придется разрабатывать ООП, логику программы и всё тщательно продумывать.

Этап 6. Разработчик софта.

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

Этап 7. Трехмерная графика.

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

В конце:

Если ты честно выполнил все задания, можешь пошуршать по этим сайтам и найти себе подходящий для своего развития. Но я не рекомендую даже заглядывать по этой ссылке, пока не пройдешь хотя бы 100 заданий из этого списка (смекаете, да?). По этому бери задачу, решай и так до конца.

Обо мне

Обо мне? Так.. реализую свои идеи. Интересно если, можете посмотреть: [Гик-дневник] или просто посетить мою страницу и найти что-нибудь интересное для себя. Если тебе понравится шаблон — обязательно оставь отзыв. Если ты прошел его, или находишься на каком-либо моменте, скажи, как было бы по твоему лучше (я подправлю — сделав шаблон еще лучше).

Консольная шпаргалка

Постановка задачи: красиво вывести информацию о типах данных (целочисленные, строки) и их переменных (int, string) и других существующих в вашем языке типе данных. Оформить всё аккуратно и красиво.

Консольный перехват ошибки

Постановка задачи: написать программу, в которой может случиться 5 случаев, в случае которых может возникнуть ошибка. Научиться эту ошибку перехватывать и не давать программе выключаться (оповещать об ошибке, но не давать выключаться программе, продолжая её работу).

Консольный калькулятор

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

Консольный массив

Постановка задачи: Разработать программу которая умеет выводить массив M x N.

Усложнение задачи: Сделать так, чтобы можно было производить какие-либо операции над массивами. (К примеру чисел в массиве, нахождение общего знаменателя и так далее — подобные задачи можно найти в интернете). Для того чтобы зачесть себе в карму усложнение задачи, решите как минимум 5 задач с матрицами.

Консольная рекурсия

Постановка задачи: Создать консольную программу выполняющую рекурсию (хорошо подойдет цикл do while), иначе говоря которая закончится только при определенном действии (к примеру «выход»).

Консольные наскальные рисунки

Постановка задачи: Создать консольную программу, которая выводит в консоли определенный рисунок. Пользуйтесь возможностью консоли изменять цвет текста и цвет подложки под текст — за счет этого можно изображать своеобразные «рисунки». Можете воспользоваться рисунками в виде текстовых символов (в интернете полно примеров).

Консольная свободная задача #1

Постановка свободной задачи: поставьте перед собой определенную конкретную задачу, расписав алгоритм (как эта задача будет действовать) и попробуйте решить её. Постарайтесь сделать так, чтобы задача не была сложной (чтобы вы знали, что нужно сделать чтобы решить её), но, в то же время не стандартной.

Консольная свободная задача #2

Постановка свободной задачи: как и в свободной задаче #1-4

Консольная свободная задача #3

Постановка свободной задачи: как и в свободной задаче #1-4

Консольная свободная задача #4

Постановка свободной задачи: как и в свободной задаче #1-4

Конвертер величин

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

Записки

Постановка задачи: разработать программу которая может сохранять ваши записки (и загружать их). Записки должны быть в .txt формате. Программа должна напоминать простой текстовый редактор.

Легкое тестирование

Постановка задачи: не нужно громоздить крутую программу для тестирования, разработайте простую программу тестирования на основе какого-либо алгоритма (теста), или своего собственного. Сделайте так, чтобы программа выдавала результаты на основании полученных данных.

Мои важные программы

Постановка задачи: Вы пользуетесь какими-то определенными программами уже на протяжении долгого времени? Разработайте программу, которую вы запустите единожды и через неё сможете запустить одно из нужных вам приложений. Хотите усложнить? Добавьте возможность сворачивать вашу программу в трей (чтобы к ней было легко обратиться).

Дизайнерское решение

Постановка задачи: Используя особый элемент — картинку(/картинки) (или как вам удобней), сделайте простую программу, к примеру калькулятор (простой), таким образом, чтобы все элементы были исключительно элементами вашего дизайна (а не предложенного, т.е. к примеру стандартные кнопки).

Мини-веб-браузер

Постановка задачи: Разработайте программу, которая будет с легкостью читать .html файлы и будет перемещаться между ними (т.е. при нажатии на ссылку открывать следующий файл, который был задан через html код). Если вы не разбираетесь в html, сделайте так, чтобы ваша программа могла читать интернет-сайты.

Код доступа «V3N3P4»

Постановка задачи: разработать программу, в которой хранятся секретные данные (текстовые), которая способна шифровать эти данные и доступ к которой засекречен паролем (который можно изменить).

У меня есть свой функционал

Постановка задачи: Разработайте программу в которой есть элемент «меню«, аккуратно и красиво оформленное, благодаря которому можно попадать в отдельную категорию. К примеру сделайте программу, выглядящую следующим образом: у вас есть кнопка, текстовое окно (которое загружает определенный текст) и меню. На меню вы выбираете одну из созданных вами программ, на кнопке появляется «запуск!», а в текстовом окне информация о программе.

Секундомер и таймер

Постановка задачи: Разработайте программу, которая умеет засекать время по кругам и выдавать информацию. А так же отдельную часть программы посвященную для таймера (обратного отсчета). Обязательные условия: должно быть одно окно (не должно быть переходов по окнам), а так же секундомер и таймер не должны пересекаться (два отдельных информационных поля). Одно окно, включен (к примеру) секундомер. Нажимаем на отдельную кнопку, секундомер исчезает, на его месте появляется таймер.

Произвольная задача

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

Черное или белое?

Постановка задачи: Разработать программу, благодаря которой можно потренировать свою интуицию, выбирая между «черным» и «белым», программа же должна рандомно выдавать определенный цвет (по желанию можно усложнить программу).

Числовой диапазон

Постановка задачи: Разработать программу, которая будет определять сколько цифр X (вводится с клавиатуры) содержится в диапазоне чисел от a1 до a2 (то есть программа должна будет перебирать цифры и искать в них совпадение с цифрой X). Результат выдавать на экран (желательно больше статистики).

Буквоцифры

Постановка задачи: В русском языке 33 буквы, ваша задача сделать программу которая сможет производить операции со словами (переводить каждый символ в цифру, складывать её с остальными цифрами и в результате получать число) — в последствии производить операции над этим числом.

Пример:
Саша + Маша = 89

(19 + 1 + 26 + 1) + (14 + 1 + 26 + 1) = 47 + 42

Микробы

Постановка задачи: Составить программу решающую следующую задачу:

В пробирку посадили микроб ровно в текущее время. Каждую минуту микроб делится на два таких же микроба, те, в свою очередь, через минуту тоже делятся, и т.д. Сделать так, чтобы пользователь мог отслеживать рост микробов и указывать время, когда количество микробов должно прекратить размножаться.

Песочные часы

Постановка задачи: Разработать программу — песочные часы. Время должно устанавливаться с клавиатуры.

Игральные кости

Постановка задачи: Разработать программу по аналогу игральной кости. Разработать возможность выдачи из разных игральных костей (додекаэдр и прочие). Так же разработать возможность использования нескольких костей одновременно.

Постановка задачи: Разработать программу — весы, которая будет взвешивать определенные объекты. Объекты должны быть заранее установлены в программу.

Яблочный завод

Постановка задачи: Создать программу, которая будет работать как завод, выпускать яблоки. При этом должны попадаться плохие яблоки с периодичностью в 5%. Сделать возможность паковать яблоки, при этом добавить возможность делить яблоко пополам.

Купюрообменник

Постановка задачи: У вас есть определенное количество монет (разного номинала), от копеек до рублей. Разработайте возможность перевода этих денег в купюры различного номинала, с возможностью выдавать остаток. Алгоритм задачи — на собственное усмотрение.

Отель 5 звезд

Постановка задачи: Разработать программу, в которой есть M гостиничных номеров (каждый номер должен добавляться отдельно. Для презентации номеров отеля с указанием цены и что находится в комнате. Оформить всё стильно, как будто вы и вправду презентуете пятизвездочный отель.

В какой баноке находится шарик?

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

Дом для кошек

Постановка задачи: есть десять домов для кошек. По очереди в каждый из домиков (случайным образом) заселяется кошка. Предоставить пользователю задачу, в которой он должен будет определить, в какой последовательности заселялись в дома кошки. Оформить всё красиво.

Постановка задачи: Составить программу могущую решать следующую задачу:

Задачка: Два поезда, находящиеся на расстоянии A км, движутся навстречу друг другу со скоростью B1 и B2 км/ч каждый. Муха берёт старт с одного из поездов и летит по направлению к другому со скоростью X км/ч. Долетев до другого поезда, муха разворачивается и летит назад к первому. Так она летает туда и обратно, пока два поезда не сталкиваются, и насекомое погибает. Какое расстояние успела пролететь муха?

Разработать алгоритм растосовки карт

Постановка задачи: В интернете много алгоритмов тосовки карт, если не справитесь, можете подглядеть. Карты должны тосоваться таким образом, чтобы избегать максимальное количество повторов, выдавая оптимальную тосовку карт. Обязательно использовать массив.

Познавательные приключения в машине

Постановка задачи: разработать программу, благодаря которой вы можете определить в какую сторону движется тот, или иной предмет. Для примера можете взять три предмета: «маятник», «пузырь в банке с водой» и «шарик с гелием». При этом разработайте анимацию и кнопки, на которых вы запускаете машину и заставляете её тормозить.

.
Подсказка:

Если машина начнет двигаться вперед, то:

  • Маятник отклонится назад.
  • Шарик с гелием отклонится вперед.
  • Пузырь в банке с водой отклонится вперед.

Соответственно при торможении — наоборот.

Если так и не поняли, посмотрите познавательное видео:

План эвакуации

Постановка задачи: в штатах, где часто встречаются смерчи есть маленький городок, который может перемещаться. Разработать программу в которой вы сможете на массиве исследовать, куда лучше передвинуться. Смерчей может быть N, городок обязательно один (не усложняйте задачу). Смерчи передвигаются случайным образом на 1 клетку (в двумерном массиве), дом вы можете перемещать сами (выбирая нужную вам ячейку в двумерном массиве.

Простое решение задачи: Дать смерчам двигаться по массиву, а дом передвигать вручную, пользуясь текстовым полем.

Сложное решение задачи: Использовать графичческий интерфейс, где можно отследить перемещение дома.

Задача со спичками

Постановка задачи: Разработать программу Drag&Drops со спичками, чтобы пользователь мог перетаскивать определенные спички и получать нужный результат. Задачи со спичками можно достать в интернете.

Лягушки в болоте

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

Лабиринты

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

Магический шар

Постановка задачи: Разработать программу, которая будет как «магически» шар выдавать случайный результат. К примеру, вы ей задаете вопрос: «. . .. . .. ?», а она выдает вам результат из предложенного:

  • Да
  • Нет
  • Скорее всего да
  • Скорее всего нет
  • Возможно
  • Имеются перспективы
  • Вопрос задан неверно

По желанию дополнить ответами.

Гексагон

Постановка задачи: Разработать любое на ваше усмотрение приложение, имеющее гексагональную структуру (состоять из шестиугольников, как соты. Важно чтобы интерфейс строился на гексагональных фигурах.

Ассоциации

Постановка задачи: Компьютер должен предлагать интересное слово, которое должен в виде ассоцииации передать один игрок, другому игроку (и так до последнего). Суть в интересе сравнить изначальное слово (о котором знает тот, кто сидит у компьютера) с конечным. Программа очень простая.

Загадки

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

Крутилка для твистера

Постановка задачи: Есть игра, называемая «твистер» — для неё есть специальный спинер, который не всегда удобно крутить играючи. Разработайте программу благодаря которой один из игроков, который ближе всего к мышке сможет крутить спинер.

Фанты

Постановка задачи: Разработайте программу, выдающую определенный «фант», который игрок обязан будет выполнить. Фанты должны выгружаться из текстового файла, в котором построчно были введены определенные задания. Фанты можно редактировать, добавлять, или удалять через программу.

Правда или желание

Постановка задачи: Разработать игру, которая спрашивает: «Правда, или желание?», в случае выбора игрока, игрок должен будет рассказать какую-либо правду, спрошенную компьютером, или выполнить желание, которое компьютер выдаст. Ответы должны быть заранее заготовлены. Игрок выбирается произвольно, рандомом, но не учитывая N предыдущих (т.е. задается с компьютера, сколько раз не спрашивать того человека, который отвечал).

Бутылочка

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

Крокодил

Постановка задачи: разработать программу, которая будет выдавать изображение и название данного изображения (к примеру: «Радуга прыгает через забор») и человек, удививший это изображение должен будет как-либо изобразить перед компанией данное изображение, не используя слов и не показывая на похожие предметы. Изобразить собой.

Я никогда не .


Постановка задачи: Разработать программу, в которой будет заложено какие-либо действия, которые мог совершать человек. Разработать колличество баллов (или возможности играть без них), по которым видно, сколько разных действий совершал человек, предложенных компьютером.

Произвольная задача игры для компании

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

Сапер

Постановка задачи: Разработать программу, как аналог саперу. Можно и желательно со своим интерфейсом. Со своими упрощенными, или усложненными задачами (в зависимости от того, как справитесь с поставленной перед собой задачей).

Найди число

Постановка задачи: Арифметическая задача, внутри которой вам нужно найти число заданное системой. Как реализовывать данный алгоритм решайте сами.

Пинболл

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

Дурак

Постановка задачи: Очередная сложная задача, только на этот раз вам нужно разработать карточную игру.

Косынка

Постановка задачи: Еще одна сложная задача, в которой вам нужно разработать еще одну карточную игру.

Шашки

Постановка задачи: На этот раз вам предстоит разработать более сложную игру с матрицей и моделью игры «шашки».

Морской бой

Постановка задачи: На этот раз действительно сложная задача, состоящая из 2 матриц, одна из которых поле врага, другая — ваша. При этом тут должны использоваться не только матрицы, но и элементы Drag and Drop для перемещения кораблей. Элементы взаимодействия для нападения на противника, и, нападения противника на вас.

Крестики нолики

Постановка задачи: Разработать программу (простую) для игры в крестики нолики.

Судоку

Постановка задачи: На этот раз очень сложная задача, в которой вам предстоит изучить алгоритм работы и принципа «судоку», после чего вам предстоит разработать игру, которая будет предоставлять пользователю возможность играть в судоку. Для упрощения задачи пользуйтесь алгоритмами из интернета.

Трубопровод

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

Точки

Постановка задаи: Разработать игру на подобии этой игры: [ссылка], только со своими возможными условиями.

Змейка

Постановка задачи: Разработать игру на подобии игры «змейка».

Бык и корова

Постановка задачи: Разработать программу некогда существовавшей популярной игры, в которой нужно получить правильный ответ. В этой игре должны участвовать двое человек (или человек и ИИ). Описание игры смотрите в интернете. Пример реализации игры можно посмотреть тут

Алхимия

Постановка задачи: Разработать игру, аналогичную игре «алхимия».

100 дверей

Постановка задачи: Разработать игру, аналогичную игре «100 дверей».

Открой замок

Постановка задачи: Разработать игру, в которой вы взломщик и должны взломать замок.

Рисовалка

Постановка задачи: Разработать приложение в котором вы сможете рисовать. К примеру разукрашивать картины.

Лазерный луч

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

Красная кнопка

Постановка задачи: Разработать программу, которая будет выполнять забавный функционал «красной кнопки». К примеру как игра 100 методов нажать красную кнопку (и уничтожить мир — пример в видео). Думайте сами.

Постановка задачи: Разработать игру, аналогичную игре 2048.

Постановка задачи: Разработать игру в которой есть матрица, к примеру 3х3 (9 клеток), в которой отсутствует одна картинка. Сделать так, чтобы пользователь мог перемещая картинки собрать картину (и вставить последнюю деталь).

Пазлы

Постановка задачи: Разработать игру, аналогичную сборке пазлов.

Передвинь блок

Постановка задачи: У вас есть определенные блоки, вам нужно задвинуть блок в определенное место. Игра должна иметь как и внутреннюю логику (для программы), так и внешнюю (чтобы пользователь поломал голову).

Загони шарик

Постановка задачи: Разработать игру, в которой нужно крутить квадрат таким образом, чтобы загнать шарик в лунку.

Произвольная простая игра

Постановка задачи: Вы разработали много игр, теперь ваша задача состоит в том, чтобы придумать свою игру, красивую, но в тоже время простую и незамысловатую (особо не напрягайтесь, старайтесь не делать из этой игры долгосрочный сложный проект).

Свой платформер

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

Что требуется для платформера:

  • Свой простой мир состоящий из уровней.
  • Свой персонаж (или персонажи) взаимодействующие с миром.
  • Своя физика мира (от которой отталкиваются персонажи)
  • Враги (можно и без них), которые влияют отрицательно на персонажа.
  • Препятствия (можно и без них) с которыми взаимодействует персонаж.

Обязательные условия:

  • Перед созданием игры начертите схему на бумаге, продумав все детали.
  • Библиотеки классов dll. Т.е. обязательное использование ООП.

Нарисован план на листочке

Разработана схема ООП

Приступили к разработке

Своя рпг

Постановка задачи: есть такой жанр игр как «ролевые игры», или «рпг», в которых у вас есть персонаж (или несколько), которые проходят по сюжету и развивают его. Не нужно грамоздкой графики, достаточно воспользоваться псевдо-3D (вид сверху) и сделать простенькую игру.

Что требуется для рпг:

  • Свой мир со своей атмосферой и развивающимся сюжетом.
  • Свой персонаж (или персонажи) взаимодействующий с миром.
  • Враги, которые наполняют и мешают персонажу во время сюжета.
  • Дополнительный контент.

Обязательные условия:

  • Перед созданием игры начертите схему на бумаге, продумав все детали.
  • Библиотеки классов dll. Т.е. обязательное использование ООП.

Нарисован план на листочке

Разработана схема ООП

Приступили к разработке

Свои гоночки

Постановка задачи: есть жанр игры «гонки», в которых есть какой-либо вид транспорта соревнующийся между собой. Как делать программу — решайте сами, главное, чтобы она вписывалась в жанр. Можете платформенные гоночки, можете псевдо-3D. Как хотите.

Обязательные условия:

  • Перед созданием игры начертите схему на бумаге, продумав все детали.
  • Библиотеки классов dll. Т.е. обязательное использование ООП.

Нарисован план на листочке

Разработана схема ООП

Приступили к разработке

Своя стратегия

Постановка задачи: есть такой жанр игр как «стратегия», где вы должны продумывать определенные действия, что-либо развивать и возможно воевать (или конкурировать). Разработайте свою, простую стратегию. Задание самое сложное, так как стратегии обычно требуют хорошей логики.

Что требуется для стратегии:

  • Свой мир со своими типами существ (или их характеров).
  • Взаимодействия развития ресурсов (империи, или города, или еще чего-либо) игрока.
  • Взаимодействие с конкурентами, или врагами.

Обязательные условия:

  • Перед созданием игры начертите схему на бумаге, продумав все детали.
  • Библиотеки классов dll. Т.е. обязательное использование ООП.

Нарисован план на листочке

Разработана схема ООП

Приступили к разработке

Произвольная сложная игра

Постановка задачи: На этот раз (если вы добрались до этого пункта) всё ложится на ваши плечи! Сами выбирайте жанр, сами выбирайте направление и развивайте свою какую-либо игру. Возможно она станет разовым проектом (после испытания того, что вы создавали). Возможно постоянным.

Обязательные условия:

  • Перед созданием игры начертите схему на бумаге, продумав все детали.
  • Библиотеки классов dll. Т.е. обязательное использование ООП.

Нарисован план на листочке

Разработана схема ООП

Приступили к разработке

Программа по тестированию

Постановка задачи: Разработать программу в которой есть своя база данных с вопросами к тестированию. Которая способна оценивать результат студента / ученика, еще кого-либо и выдавать соответствующий результат в виде какого-либо показателя.

Календарь

Постановка задачи: Разработать программу — календарь. С возможностью просматривать даты и время.

Калькулятор

Постановка задачи: Разработать программу калькулятор. Усложнять ли, решайте сами.

Проигрыватель музыки

Постановка задачи: Разработать свой простой проигрыватель музыки.

Интерфейсы

Постановка задачи: Существуют всякие виджеты, гаджеты, попробуйте разработать чтонибудь своё, что может взаимодействовать с интерфейсом Windows (или той ОС, которую вы используете). Так же добавьте возможность менять обои рабочего стола (по возможности).

Генератор паролей

Постановка задачи: Разработайте свой уникальный генератор паролей, который умеет хранить и собирать данные, может их шифровать и выдавать только при определенном запросе (или вызове подсказки). Расширьте его функционал по возможности.

Органайзе

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

Сетевой информатор

Постановка задачи: Разработайте программу, которая при подключении к интернету, будет получать нужную для вас информацию (новости, погоду, еще что-либо). Желательно разработать интерфейс для пользователя.

Постановка задачи: Разработать программу сервер, которая будет принимать и передавать запросы. И разработать программу клиент, которая будет получать и отсылать ответы. Т.е. будет происходить общение через сервер между двумя пользователями.

Сетевая игра

Постановка задачи: На основании ваших знаний разработайте игру, в которой можно будет подключаться между пользователями и взаимодействовать друг с другом непосредственно в самой игре.

Графики

Постановка задачи: Разработать программу принимающую определенную информацию и строящую на её основании графики, диаграммы и схемы. Примеры показаны на рисунках.

Sudoku на С#

Программа для решения СУДОКУ, выдающая все возможные варианты решения

Для тех, кто не знаком с Судоку читать дальше не имеет смысла.
Для тех, кто увлекается Судоку, но не интересуется программированием, целесообразно скачать программу и использовать ее по прямому назначению.

А для программистов, может быть, будет интересно проанализировать алгоритм решения…

Это не студенческое задание.
Так, из спортивного интереса, я когда-то написал программку для решения этой японской головоломки на VBA (Excel).

Целью было — просто проверять, имеется ли решение для данного варианта конкретной Судоку. Поэтому и решал методом простого перебора с проверкой истинности условий по всем 18 линиям и 9 квадратикам.

Конечно, не рационально и долго.
Почти целую минуту…
Хотя для человека это недостижимый результат…

Кого интересует код на VBA (Excel) – скачать xls-файл…
Этим же файлом могут воспользоваться те, у кого не установлена .NET Framework 4. Только макросы включать не забывайте.

От жалости к компьютеру (его не рациональному труду) и зародилась мысль,
решить задачу не методом сплошного перебора, а логично…
Т.е. присваивать одно из альтернативных значений клетке только в том случае,
если по методу исключений уже невозможно определить значение ни для одной из ячеек.

Павел Жигулин – студент и талантливый программист, взялся за реализацию такой
программы на своем любимом языке C# (Visual Studio 2010, необходима .NET Framework 4).
Предметную область мы обсуждали и разрабатывали вместе.
На мой взгляд, задача оказалась менее заковыристой, чем казалась на первый взгляд
(но не знаю, как Павел на это дело смотрит).

Минимум классов предметной области:

  • Доступность
  • Клетка
  • Регион
  • ход

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

А ход представляет собой объект, который в начальный период присваивает одной единственной клетке альтернативное значение, а затем выполняет цепочку необратимых изменений, которые повлекло за собой это первое присвоение.

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

Программа работает практически мгновенно. При условии, что Судоку реальное
(т.е. не менее 20 клеток на начальный момент заполнено)…
Если заданы значения одной или двух клеток, то вариант может быть и не предсказуемым…
Например: «решение не найдено», но над этим мы еще поработаем.

Кроме того, программа позволяет при первом найденном решении, продолжить поиск и будет
останавливаться при каждом следующем найденном решении, услужливо спрашивая пользователя: «Продолжить? Или уже достаточно?».

Скачивайте и тестируйте программу,

а через некоторое время исходный код будет открыт, и, конечно,
в первую очередь для читателей рассылки ! …

Я лично, как апологет кибернетики «черного ящика» (и Искусственного Интеллекта в целом)
получил большое удовольствие от проделанной работы…

Можно достаточно легко переделать программу на составление (генерацию) судоку.

Мастер Йода рекомендует:  Выгрузка турбо-страниц с помощью сервиса Яндекс.Вебмастер
Добавить комментарий
Конструктор Судоку
‘+arr[field.substr(i,1)-1] + ‘ 47)&&(event.keyCode