Как правильно составить судоку

Шаги

  1. Изображение с названием Create a Sudoku Step 1

    1

    Начните с решения. Можете использовать сгенерированную на компьютере сетку цифр или уже опубликованную головоломку, но создать собственную вручную можно всего за несколько минут. Существует 6,670,903,752,021,072,936,960[1]
    правильных комбинаций. Вам нужна только одна.

    1. Draw a 9×9 grid made of 9 3×3 cells.
    2. Возьмите карандаш. Лучше карандаш, чем ручка, чтобы легче было исправить ошибки, которых не избежать.
    3. Впишите цифру 1 в любую клеточку в соответствии с правилами судоку.
    4. Повторяйте этот шаг, пока единичка не появится в каждом ряду, колонке и мини-квадратике 3х3.
    5. Проделайте это со всеми цифрами от 2 до 9. Возможно, здесь возникнут трудности. Если так, сотрите цифры, создавшие проблему. Попробуйте передвинуть пару одинаковых цифр из углов прямоугольника в другие углы, если там есть свободные клеточки. Попробуйте переставить 3 цифры в ряду, колонке или мини-квадратике. Если это решит проблему и не создаст новую, продолжайте.
  2. Изображение с названием Create a Sudoku Step 2

    2

    Разбросайте цифры в сетке. Возможно, вы начали с того, что вписали в первый ряд 123456789. Если не хотите, чтобы головоломка осталась такой, примените одну из нижеследующих процедур. В большинстве случаев из одной сетки могут получиться миллиарды других, но в некоторых особо симметричных случаях получатся только миллионы.[1]

    • Поменяйте местами ряды 1-3, 4-6 или 7-9.
    • Поменяйте местами колонки 1-3, 4-6 или 7-9.
    • Поменяйте местами блоки рядов 3×9.
    • Поменяйте местами блоки колонок 9×3.
    • Поверните сетку на 90, 180 или 270 градусов.
    • Отразите сетку по горизонтали, вертикали или диагонали.
    • Поменяйте местами цифры.
  3. Изображение с названием Create a Sudoku Step 3

    3

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

  4. Изображение с названием Create a Sudoku Step 4

    4

    Продолжая усложнять головоломку, убирая все больше цифр, следите, чтобы он оставалась разрешимой. Здесь вам помогут онлайн-инструменты типа [1] и [2]. Если из-за недостающих цифр у головоломки появилось несколько решений или одно, но чрезвычайно сложное, вернитесь на несколько шагов назад и попробуйте убрать другие цифры.

  5. Изображение с названием Create a Sudoku Step 5

    5

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

  6. Изображение с названием Create a Sudoku Final

    6

    <finished>

    Реклама

Советы

  • Обычно в головоломках судоку дается 20-30 цифр.
  • Некоторым составителям судоку нравится, чтобы клетки с исходными данными обладали вращательной симметрией на 180 градусов. Чтобы добиться этого, убирая цифры в шаге 3, убирайте пары диагонально противоположных цифр.
  • Вариантов судоку очень много, и большую часть приведенных указаний легко обобщить. Решающий инструмент Scanraid поддерживает самые распространенные варианты, но если вы хотите поэкспериментировать с менее известными вариациями, придется проверять их вручную или создать собственный решающий механизм.
  • Существуют компьютерные программы для создания судоку, но лучшие головоломки были разработаны вручную.

Реклама

Что вам понадобится

  • Ручка
  • Карандаш
  • Ластик
  • Воображение
  • Запас терпения
  • Бумага
  • Надежда

Об этой статье

Эту страницу просматривали 23 010 раз.

Была ли эта статья полезной?

Алгоритм генерации судоку

Время на прочтение
9 мин

Количество просмотров 126K

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

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

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

Основные правила Судоку

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

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

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

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

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

class grid:
	def __init__(self,n = 3):
		"""Generation of the base table"""
		self.n = n
		self.table = [[((i*n + i/n + j) % (n*n) + 1) for j in range(n*n)] for i in range(n*n)]
		print "The base table is ready!"

	def __del__(self):
		pass
	
	def show(self):
		for i in range(self.n*self.n):
			print self.table[i]

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

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

  • Транспонирование всей таблицы — столбцы становятся строками и наоборот (transposing)

  • Обмен двух строк в пределах одного района (swap_rows_small)
  • Обмен двух столбцов в пределах одного района (swap_colums_small)

  • Обмен двух районов по горизонтали (swap_rows_area)
  • Обмен двух районов по вертикали (swap_colums_area)

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

transposing

	def transposing(self):
		""" Transposing the whole grid """
		self.table = map(list, zip(*self.table))

swap_rows_small

	def swap_rows_small(self):
		""" Swap the two rows """
		area = random.randrange(0,self.n,1)
		line1 = random.randrange(0,self.n,1)
		#получение случайного района и случайной строки
		N1 = area*self.n + line1
		#номер 1 строки для обмена

		line2 = random.randrange(0,self.n,1)
		while (line1 == line2):
			line2 = random.randrange(0,self.n,1)

		N2 = area*self.n + line2
		#номер 2 строки для обмена

		self.table[N1],self.table[N2] = self.table[N2], self.table[N1]

swap_colums_small

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

	def swap_colums_small(self):
		grid.transposing(self)
		grid.swap_rows_small(self)
		grid.transposing(self)

swap_rows_area

	def swap_rows_area(self):
		""" Swap the two area horizon """
		area1 = random.randrange(0,self.n,1)
		#получение случайного района

		area2 = random.randrange(0,self.n,1)
		while (area1 == area2):
			area2 = random.randrange(0,self.n,1)

		for i in range(0, self.n):
			N1, N2 = area1*self.n + i, area2*self.n + i
			self.table[N1], self.table[N2] = self.table[N2], self.table[N1]

swap_colums_area

	def swap_colums_small(self):
		grid.transposing(self)
		grid.swap_rows_area(self)
		grid.transposing(self)

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

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

	def mix(self,amt = 10):
		mix_func = ['self.transposing()', 
					'self.swap_rows_small()', 
					'self.swap_colums_small()', 
					'self.swap_rows_area()', 
					'self.swap_colums_area()']
		for i in xrange(1, amt):
			id_func = random.randrange(0,len(mix_func),1)
			eval(mix_func[id_func])

Пример 10 итераций перемешивания

base
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[4, 5, 6, 7, 8, 9, 1, 2, 3]
[7, 8, 9, 1, 2, 3, 4, 5, 6]
[2, 3, 4, 5, 6, 7, 8, 9, 1]
[5, 6, 7, 8, 9, 1, 2, 3, 4]
[8, 9, 1, 2, 3, 4, 5, 6, 7]
[3, 4, 5, 6, 7, 8, 9, 1, 2]
[6, 7, 8, 9, 1, 2, 3, 4, 5]
[9, 1, 2, 3, 4, 5, 6, 7, 8]

swap_colums_area
[7, 8, 9, 4, 5, 6, 1, 2, 3]
[1, 2, 3, 7, 8, 9, 4, 5, 6]
[4, 5, 6, 1, 2, 3, 7, 8, 9]
[8, 9, 1, 5, 6, 7, 2, 3, 4]
[2, 3, 4, 8, 9, 1, 5, 6, 7]
[5, 6, 7, 2, 3, 4, 8, 9, 1]
[9, 1, 2, 6, 7, 8, 3, 4, 5]
[3, 4, 5, 9, 1, 2, 6, 7, 8]
[6, 7, 8, 3, 4, 5, 9, 1, 2]

swap_colums_small
[7, 8, 9, 4, 5, 6, 2, 1, 3]
[1, 2, 3, 7, 8, 9, 5, 4, 6]
[4, 5, 6, 1, 2, 3, 8, 7, 9]
[8, 9, 1, 5, 6, 7, 3, 2, 4]
[2, 3, 4, 8, 9, 1, 6, 5, 7]
[5, 6, 7, 2, 3, 4, 9, 8, 1]
[9, 1, 2, 6, 7, 8, 4, 3, 5]
[3, 4, 5, 9, 1, 2, 7, 6, 8]
[6, 7, 8, 3, 4, 5, 1, 9, 2]

swap_colums_small
[7, 8, 9, 4, 5, 6, 1, 2, 3]
[1, 2, 3, 7, 8, 9, 4, 5, 6]
[4, 5, 6, 1, 2, 3, 7, 8, 9]
[8, 9, 1, 5, 6, 7, 2, 3, 4]
[2, 3, 4, 8, 9, 1, 5, 6, 7]
[5, 6, 7, 2, 3, 4, 8, 9, 1]
[9, 1, 2, 6, 7, 8, 3, 4, 5]
[3, 4, 5, 9, 1, 2, 6, 7, 8]
[6, 7, 8, 3, 4, 5, 9, 1, 2]

transposing
[7, 1, 4, 8, 2, 5, 9, 3, 6]
[8, 2, 5, 9, 3, 6, 1, 4, 7]
[9, 3, 6, 1, 4, 7, 2, 5, 8]
[4, 7, 1, 5, 8, 2, 6, 9, 3]
[5, 8, 2, 6, 9, 3, 7, 1, 4]
[6, 9, 3, 7, 1, 4, 8, 2, 5]
[1, 4, 7, 2, 5, 8, 3, 6, 9]
[2, 5, 8, 3, 6, 9, 4, 7, 1]
[3, 6, 9, 4, 7, 1, 5, 8, 2]

swap_colums_small
[7, 1, 4, 8, 2, 5, 6, 3, 9]
[8, 2, 5, 9, 3, 6, 7, 4, 1]
[9, 3, 6, 1, 4, 7, 8, 5, 2]
[4, 7, 1, 5, 8, 2, 3, 9, 6]
[5, 8, 2, 6, 9, 3, 4, 1, 7]
[6, 9, 3, 7, 1, 4, 5, 2, 8]
[1, 4, 7, 2, 5, 8, 9, 6, 3]
[2, 5, 8, 3, 6, 9, 1, 7, 4]
[3, 6, 9, 4, 7, 1, 2, 8, 5]

swap_rows_small
[7, 1, 4, 8, 2, 5, 6, 3, 9]
[8, 2, 5, 9, 3, 6, 7, 4, 1]
[9, 3, 6, 1, 4, 7, 8, 5, 2]
[5, 8, 2, 6, 9, 3, 4, 1, 7]
[4, 7, 1, 5, 8, 2, 3, 9, 6]
[6, 9, 3, 7, 1, 4, 5, 2, 8]
[1, 4, 7, 2, 5, 8, 9, 6, 3]
[2, 5, 8, 3, 6, 9, 1, 7, 4]
[3, 6, 9, 4, 7, 1, 2, 8, 5]

swap_rows_small
[7, 1, 4, 8, 2, 5, 6, 3, 9]
[8, 2, 5, 9, 3, 6, 7, 4, 1]
[9, 3, 6, 1, 4, 7, 8, 5, 2]
[5, 8, 2, 6, 9, 3, 4, 1, 7]
[4, 7, 1, 5, 8, 2, 3, 9, 6]
[6, 9, 3, 7, 1, 4, 5, 2, 8]
[2, 5, 8, 3, 6, 9, 1, 7, 4]
[1, 4, 7, 2, 5, 8, 9, 6, 3]
[3, 6, 9, 4, 7, 1, 2, 8, 5]

swap_rows_area
[7, 1, 4, 8, 2, 5, 6, 3, 9]
[8, 2, 5, 9, 3, 6, 7, 4, 1]
[9, 3, 6, 1, 4, 7, 8, 5, 2]
[2, 5, 8, 3, 6, 9, 1, 7, 4]
[1, 4, 7, 2, 5, 8, 9, 6, 3]
[3, 6, 9, 4, 7, 1, 2, 8, 5]
[5, 8, 2, 6, 9, 3, 4, 1, 7]
[4, 7, 1, 5, 8, 2, 3, 9, 6]
[6, 9, 3, 7, 1, 4, 5, 2, 8]

swap_colums_small
[7, 1, 4, 8, 2, 5, 6, 9, 3]
[8, 2, 5, 9, 3, 6, 7, 1, 4]
[9, 3, 6, 1, 4, 7, 8, 2, 5]
[2, 5, 8, 3, 6, 9, 1, 4, 7]
[1, 4, 7, 2, 5, 8, 9, 3, 6]
[3, 6, 9, 4, 7, 1, 2, 5, 8]
[5, 8, 2, 6, 9, 3, 4, 7, 1]
[4, 7, 1, 5, 8, 2, 3, 6, 9]
[6, 9, 3, 7, 1, 4, 5, 8, 2]

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

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

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

Итак, приступим к вычёркиванию ячеек (все варианты равнозначны, поэтому у нас 81 ячейка, которую можно вычеркнуть, поэтому проверим все перебором):

  1. Выбрать случайную ячейку N
  2. Отметить N просмотренной
  3. Удалить N
  4. Посчитать решения. Если оно не единственное, то вернуть N обратно

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


flook = [[0 for j in range(example.n*example.n)] for i in range(example.n*example.n)]
iterator = 0
difficult = example.n ** 4 #Первоначально все элементы на месте

while iterator < example.n ** 4:
	i,j = random.randrange(0, example.n*example.n ,1), random.randrange(0, example.n*example.n ,1) # Выбираем случайную ячейку
	if flook[i][j] == 0:	#Если её не смотрели
		iterator += 1
		flook[i][j] = 1 	#Посмотрим

		temp = example.table[i][j]	#Сохраним элемент на случай если без него нет решения или их слишком много
		example.table[i][j] = 0
		difficult -= 1 #Усложняем, если убрали элемент

		table_solution = []
		for copy_i in range(0, example.n*example.n):
			table_solution.append(example.table[copy_i][:]) #Скопируем в отдельный список

		i_solution = 0
		for solution in solver.solve_sudoku((example.n, example.n), table_solution):
			i_solution += 1 #Считаем количество решений

		if i_solution != 1: #Если решение не одинственное -- вернуть всё обратно
			example.table[i][j] = temp
			difficult += 1  #Облегчаем

example.show()
print "difficult = ",difficult

sudoku_generator.py

# coding=utf-8
import random
import solver

class grid:
	def __init__(self,n = 3):
		""" Generation of the base table """
		self.n = n
		self.table = [[ ((i*n + i/n + j) % (n*n) + 1) for j in range(n*n)] for i in range(n*n)]
		print "The base table is ready!"

	def __del__(self):
		pass
	
	def show(self):
		for i in range(self.n*self.n):
			print self.table[i]

	def transposing(self):
		""" Transposing the whole grid """
		self.table = map(list, zip(*self.table))

	def swap_rows_small(self):
		""" Swap the two rows """
		area = random.randrange(0,self.n,1)
		line1 = random.randrange(0,self.n,1)
		#получение случайного района и случайной строки
		N1 = area*self.n + line1
		#номер 1 строки для обмена

		line2 = random.randrange(0,self.n,1)
		#случайная строка, но не та же самая
		while (line1 == line2):
			line2 = random.randrange(0,self.n,1)

		N2 = area*self.n + line2
		#номер 2 строки для обмена

		self.table[N1],self.table[N2] = self.table[N2], self.table[N1]


	def swap_colums_small(self):
		grid.transposing(self)
		grid.swap_rows_small(self)
		grid.transposing(self)


	def swap_rows_area(self):
		""" Swap the two area horizon """
		area1 = random.randrange(0,self.n,1)
		#получение случайного района

		area2 = random.randrange(0,self.n,1)
		#ещё район, но не такой же самый
		while (area1 == area2):
			area2 = random.randrange(0,self.n,1)

		for i in range(0, self.n):
			N1, N2 = area1*self.n + i, area2*self.n + i
			self.table[N1], self.table[N2] = self.table[N2], self.table[N1]


	def swap_colums_area(self):
		grid.transposing(self)
		grid.swap_rows_area(self)
		grid.transposing(self)
	
	def mix(self,amt = 10):
		mix_func = ['self.transposing()', 
					'self.swap_rows_small()', 
					'self.swap_colums_small()', 
					'self.swap_rows_area()', 
					'self.swap_colums_area()']
		for i in xrange(1, amt):
			id_func = random.randrange(0,len(mix_func),1)
			eval(mix_func[id_func])

example = grid()
example.mix()

flook = [[0 for j in range(example.n*example.n)] for i in range(example.n*example.n)]
iterator = 0
difficult = example.n ** 4 #Первоначально все элементы на месте

example.show() 
print "---------------------------"

while iterator < example.n ** 4:
	i,j = random.randrange(0, example.n*example.n ,1), random.randrange(0, example.n*example.n ,1) # Выбираем случайную ячейку
	if flook[i][j] == 0:	#Если её не смотрели
		iterator += 1
		flook[i][j] = 1 	#Посмотрим

		temp = example.table[i][j]	#Сохраним элемент на случай если без него нет решения или их слишком много
		example.table[i][j] = 0
		difficult -= 1 #Усложняем если убрали элемент

		table_solution = []
		for copy_i in range(0, example.n*example.n):
			table_solution.append(example.table[copy_i][:]) #Скопируем в отдельный список

		i_solution = 0
		for solution in solver.solve_sudoku((example.n, example.n), table_solution):
			i_solution += 1 #Считаем количество решений

		if i_solution != 1: #Если решение не одинственное вернуть всё обратно
			example.table[i][j] = temp
			difficult += 1 # Облегчаем

example.show()
print "difficult = ",difficult

solver.py

#!/usr/bin/env python3

# Author: Ali Assaf <ali.assaf.mail@gmail.com>
# Copyright: (C) 2010 Ali Assaf
# License: GNU General Public License <http://www.gnu.org/licenses/>

from itertools import product

def solve_sudoku(size, grid):
    """ An efficient Sudoku solver using Algorithm X.

    >>> grid = [
    ...     [5, 3, 0, 0, 7, 0, 0, 0, 0],
    ...     [6, 0, 0, 1, 9, 5, 0, 0, 0],
    ...     [0, 9, 8, 0, 0, 0, 0, 6, 0],
    ...     [8, 0, 0, 0, 6, 0, 0, 0, 3],
    ...     [4, 0, 0, 8, 0, 3, 0, 0, 1],
    ...     [7, 0, 0, 0, 2, 0, 0, 0, 6],
    ...     [0, 6, 0, 0, 0, 0, 2, 8, 0],
    ...     [0, 0, 0, 4, 1, 9, 0, 0, 5],
    ...     [0, 0, 0, 0, 8, 0, 0, 7, 9]]
    >>> for solution in solve_sudoku((3, 3), grid):
    ...     print(*solution, sep='\n')
    [5, 3, 4, 6, 7, 8, 9, 1, 2]
    [6, 7, 2, 1, 9, 5, 3, 4, 8]
    [1, 9, 8, 3, 4, 2, 5, 6, 7]
    [8, 5, 9, 7, 6, 1, 4, 2, 3]
    [4, 2, 6, 8, 5, 3, 7, 9, 1]
    [7, 1, 3, 9, 2, 4, 8, 5, 6]
    [9, 6, 1, 5, 3, 7, 2, 8, 4]
    [2, 8, 7, 4, 1, 9, 6, 3, 5]
    [3, 4, 5, 2, 8, 6, 1, 7, 9]
    """
    R, C = size
    N = R * C
    X = ([("rc", rc) for rc in product(range(N), range(N))] +
         [("rn", rn) for rn in product(range(N), range(1, N + 1))] +
         [("cn", cn) for cn in product(range(N), range(1, N + 1))] +
         [("bn", bn) for bn in product(range(N), range(1, N + 1))])
    Y = dict()
    for r, c, n in product(range(N), range(N), range(1, N + 1)):
        b = (r // R) * R + (c // C) # Box number
        Y[(r, c, n)] = [
            ("rc", (r, c)),
            ("rn", (r, n)),
            ("cn", (c, n)),
            ("bn", (b, n))]
    X, Y = exact_cover(X, Y)
    for i, row in enumerate(grid):
        for j, n in enumerate(row):
            if n:
                select(X, Y, (i, j, n))
    for solution in solve(X, Y, []):
        for (r, c, n) in solution:
            grid[r][c] = n
        yield grid

def exact_cover(X, Y):
    X = {j: set() for j in X}
    for i, row in Y.items():
        for j in row:
            X[j].add(i)
    return X, Y

def solve(X, Y, solution):
    if not X:
        yield list(solution)
    else:
        c = min(X, key=lambda c: len(X[c]))
        for r in list(X[c]):
            solution.append(r)
            cols = select(X, Y, r)
            for s in solve(X, Y, solution):
                yield s
            deselect(X, Y, r, cols)
            solution.pop()

def select(X, Y, r):
    cols = []
    for j in Y[r]:
        for i in X[j]:
            for k in Y[i]:
                if k != j:
                    X[k].remove(i)
        cols.append(X.pop(j))
    return cols

def deselect(X, Y, r, cols):
    for j in reversed(Y[r]):
        X[j] = cols.pop()
        for i in X[j]:
            for k in Y[i]:
                if k != j:
                    X[k].add(i)

if __name__ == "__main__":
    import doctest
    doctest.testmod()

Результат работы

The base table is ready!
[5, 4, 6, 8, 7, 9, 2, 1, 3]
[8, 7, 9, 2, 1, 3, 5, 4, 6]
[2, 1, 3, 5, 4, 6, 8, 7, 9]
[6, 5, 7, 9, 8, 1, 3, 2, 4]
[9, 8, 1, 3, 2, 4, 6, 5, 7]
[3, 2, 4, 6, 5, 7, 9, 8, 1]
[7, 6, 8, 1, 9, 2, 4, 3, 5]
[1, 9, 2, 4, 3, 5, 7, 6, 8]
[4, 3, 5, 7, 6, 8, 1, 9, 2]
---------------------------
[0, 0, 6, 0, 0, 0, 0, 0, 0]
[8, 7, 0, 0, 1, 0, 0, 0, 6]
[0, 0, 0, 5, 4, 0, 0, 0, 9]
[6, 0, 0, 0, 8, 1, 3, 0, 4]
[0, 0, 0, 3, 0, 0, 0, 5, 0]
[0, 0, 0, 0, 0, 7, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 9, 0, 4, 0, 0, 0, 0, 8]
[0, 0, 5, 0, 6, 0, 1, 0, 0]
difficult =  22

Скачать в zip

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

  • Для проверки решения применялся Алгоритм Х и его реализация для Судоку
  • Решение Судоку на всех языках http://rosettacode.org/wiki/Sudoku

Если у кого есть лучшие предложения — не стесняйтесь оставить комментарий.
Спасибо за внимание.


Download Article


Download Article

Sudoku is a fun way to pass the time, and it’s even more fun once you learn to make your own puzzles. Creating your own puzzle can be tricky, but it will give you a new appreciation for the game. Make your 9×9 square, then fill in your clues by hand or with the help of an online generator. Once your puzzle is finished, share it with friends or try it out yourself.

  1. Image titled Create a Sudoku Step 1

    1

    Gather your materials. To make a Sudoku puzzle, you’ll need a pencil, a marker, a ruler and a sheet of standard printer paper. You’ll use the pencil for the first few steps so that you can erase any mistakes, while the ruler will help keep your grid even.[1]

  2. 2

    Draw a large square. Using your pencil and ruler, draw a large square. The square should be about 5”x5”, but you can make it larger or smaller if you like. Also, if you have a Sudoku book handy, consider tracing an existing puzzle to get a standard shape and size.[2]

    Advertisement

  3. 3

    Divide the square into a 3×3 grid. Again using your pencil, divide the large outer square into 9 smaller squares. There should be three squares on the top row, three in the middle row and three in the bottom row: three equally spaced lines going across the square, and three equally spaced lines going down the square. Make sure you use a ruler to ensure that your lines are straight.[3]

  4. 4

    Divide the small squares into 3×3 grids. Once you’ve divided the square into 9 smaller squares, you’ll need to divide those squares into even smaller grids. Using your pencil and ruler, draw three equally spaced lines across each square, then three equally spaced lines down each square. Look at an existing Sudoku puzzle if you need a reference.

  5. 5

    Trace the pencil lines with marker. It’s easy to rub away pencil, and you don’t want your board to fade away. Trace the lines you drew with a marker or pen, making sure that the lines of the first 3×3 square are thicker and bolder. The lines of the smaller squares should be light and thin, so consider using a ballpoint pen.

  6. Image titled Create a Sudoku Step 6

    6

    Copy or scan your blank puzzle. You may want to make more than one Sudoku puzzle, and you can save the hassle of having to redraw the board. Simply scan or photocopy the board and create some duplicates. Use a scanner at home or make a trip to a copy shop or library to use a photocopier.

  7. Image titled Create a Sudoku Step 7

    7

    Print out a template. If you don’t want to draw your puzzle-grid by hand, find a template online. Many websites provide grids of different sizes, and you can even find one on this page. Print as many copies of your templates as you think you’ll need.[4]

  8. Advertisement

  1. 1

    Start filling in a solution. Using a pencil, start creating a solution for your puzzle. Work with each number in order so that you can be sure your solution is valid. Don’t forget how the game works, or you’ll end up with an incorrect solution.[5]

    • Remember the rules. To win sudoku, the player must fill the grid so that each row contains the number 1-9, each column contains the numbers 1-9 and each 3×3 box contains the numbers 1-9.[6]
    • Start filling in the number 1. Place a number one in each 3×3 box, each row and each column. Make sure that that you don’t place two number ones in any column, row or 3×3 box.
    • Move on to the number 2. Begin to place the number 2 in each column, row and 3×3 square. As with the number one, make sure you don’t double up your number 2s.
    • Continue with each number consecutively. Keep adding the number 3, the number 4 and so on to each row, column and 3×3 box. As you fill in more numbers, the boxes will become easier to fill because you’ll have fewer and fewer spaces left.
  2. Image titled Create a Sudoku Step 9

    2

    Backtrack if you get stuck. Creating your solution might become frustrating. You can easily back yourself into a corner, where you’ll find that you can only fill a row or column with a duplicate number. If you end up stuck, erase a few of the problem digits and start the section over again.

  3. 3

    Double-check your solution. Make sure that your solution is correct by checking for duplicate numbers. It may take a while to go through each 3×3 block, row and column, but make sure that they each contain the numbers 1-9 with no duplicate digits. If you don’t want to do this by hand, use an online Sudoku solver. Once you’re sure it’s right, you’re ready to put on the finishing touches.[7]

  4. Image titled Create a Sudoku Step 11

    4

    Use an online generator. If making a Sudoku puzzle by hand gets too frustrating, check out an online generator. You’ll still have the ability to customize the difficulty and the number of clues, but you won’t have to do as much work. There are many different websites that can help you generate and check your puzzles.[8]

  5. Advertisement

  1. 1

    Begin removing digits. With an eraser, begin by erasing one number from each column, row and 3×3 square. The more you erase, the harder the puzzle will be to solve, so think about how difficult you want the puzzle to be. Erase lightly so that if you change your mind, you’ll be able to recover your clues. Also, consider making a copy of your solution to reference.[9]

  2. 2

    Check to make sure your puzzle can be solved. With each digit that you erase, work through the puzzle to make sure it can still be finished. Make sure that your player will still be able to use the clues available to fill in the blanks, and that there aren’t spaces with insufficient clues. If you find that it’s too difficult, replace the clues that you erased and try erasing others.

  3. 3

    Erase blank squares and ink filled ones. Once you’ve finished erasing clues, give each empty square some extra attention with the eraser. If you don’t fully erase the missing squares, your player may be able to see which number was originally there. Then, use your marker to trace the numbers in the filled squares so that they don’t smudge.[10]

    • If you want to, copy your finished puzzle onto a new grid so there’s no chance of a player seeing your original answers.
  4. Image titled Create a Sudoku Step 15

    4

    Copy and share your puzzle. Make some copies of your finished puzzle at home or in a copy shop. Next, share it with your friends and family members. Get some feedback about the difficulty of your puzzle, then practice making a few more.

  5. Advertisement

Sample Sudoku Puzzles

Image titled Create a Sudoku Step 15

Blank Sudoku Page

Add New Question

  • Question

    How can I make money by making my own sudoku puzzles?

    Community Answer

    You could create a site with free sudokus and put ads on the site. You could also use ad.fly to let people download them for free — ads show up while downloading, so you get a little money for each download. Or, simply make a large collection of them and sell as a printable PDF for a certain amount of money.

  • Question

    How do I know if it is correct?

    Community Answer

    You can try it out and see if you can solve it correctly. If not, you will realize where there are errors and be able to correct them.

  • Question

    After I create a full page Sudoku, how do I know how many numbers to remove?

    Logan Eichfeld

    Logan Eichfeld

    Community Answer

    This depends on how difficult you want your puzzle to be. If you want your puzzle to be easy, remove a small amount of numbers from the grid. If you want your puzzle to be intermediate, then remove a moderate amount of numbers from the grid. if you want your puzzle to be hard, remove a large amount of numbers from the grid.

See more answers

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

Video

  • Once you’re comfortable making standard puzzles, check out Sudoku variations. Some use larger boards, the alphabet, or symbols, and they all help keep the game fresh.

  • Get help with sudoku checkers. If you ever get stuck while making your puzzle, use an online checker to make sure that your puzzle is solvable and within the rules.

  • Don’t get too frustrated when filling in the solution. Handmaking a sudoku puzzle can be a little tricky at first, because the numbers have to be perfectly placed. However, with more practice, it will become easier and easier.

Thanks for submitting a tip for review!

Advertisement

Things You’ll Need

  • A pen
  • A pencil
  • An eraser
  • Paper
  • A ruler

References

About This Article

Article SummaryX

If you enjoy doing Sudoku puzzles, try creating your own. Draw a large square that’s around 5 inches by 5 inches. Divide the larger outer square into 9 smaller ones so there are 3 squares on the top row, 3 in the middle, and 3 on the bottom. You can now divide the small squares into 3 by 3 grids. If you need a reference, look at an actual Sudoku puzzle. Once you have your blank puzzle, start filling in solutions. Start by placing the number 1 in each 3 by 3 box, row, and column. Then move on to number 2 so you can keep track of what you’ve used so far. If making a Sudoku by hand is too tedious, then use an online generator. To learn how to remove numbers so you can have a friend solve your puzzle, keep reading!

Did this summary help you?

Thanks to all authors for creating a page that has been read 224,204 times.

Reader Success Stories

  • Anonymous

    «I have been fascinated with these puzzles since I discovered them. I really wanted to know how they were created;…» more

Did this article help you?

Как составить судоку

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

Как составить судоку

Инструкция

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

Запишите девять строк по девять цифр так, чтобы в каждой строке и в каждом столбце каждая цифра встречалась только один раз. Самый простой вариант – это запись цифр от 1 до 9 со сдвигом на три позиции по мере продвижения вниз внутри «большой» строки и на одну позицию относительно первой строки при переходе на следующую большую строку:123 456 789456 789 123789 123 456234 567 891567 891 234891 234 567345 678 912678 912 345912 345 678

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

Для того чтобы получился новый судоку, достаточно переставить местами две большие строки и два столбца. Например, поменяйте местами первую и третью большие строки:345 678 912678 912 345912 345 678234 567 891567 891 234891 234 567123 456 789456 789 123789 123 456

Переставьте первый и второй большие столбцы:678 345 912912 678 345345 912 678567 234 891891 567 234234 891 567456 123 789789 456 123123 789 456

Усложните получившийся судоку способом перестановки обычных строк или столбцов. Это можно делать только внутри больших колонок таблицы, поскольку иначе нарушится правило судоку: в каждом из 9 квадратов головоломки каждая цифра встречается только 1 раз.

Запишите в первой большой строке вторую обычную на месте третьей и наоборот, во второй строке поменяйте первую обычную с третьей, а в третьей большой строке – первую со второй:678 345 912345 912 678912 678 345234 891 567891 567 234567 234 891789 456 123456 123 789123 789 456

Первоначальный вариант уже не узнать. Теперь поменяйте тем же образом обычные столбцы внутри больших. Например, в первой большой колонке замените первый столбец на второй, во второй – первый на третий, и в третьей колонке – второй столбец на третий:768 543 912435 219 678192 876 345324 198 567981 765 234657 432 891879 654 123546 321 789213 987 456

Можете делать любые манипуляции, главное — соблюдать правило: переставлять как большие, так и обычные элементы таблицы можно только полностью. Удобнее всего составлять судоку в компьютерной программе, например, в Miscrosoft Excel. Там можно проверить себя после всех перемещений и замен, просчитав сумму каждой строки, столбца или маленького квадрата. Она должна составлять 45. Для этой цели в программе предусмотрены макросы и формулы.

Теперь самое интересное: удаление лишних цифр. В зависимости от того, какой сложности вы хотите добиться, уберите из получившейся таблицы от 30 до 70% цифр.

Видео по теме

Войти на сайт

или

Забыли пароль?
Еще не зарегистрированы?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Вы любите судоку, но устали сидеть и разгадывать их по книге? Почему не твое?

шаги

Создание судоку. Шаг 1

Создание судоку. Шаг 1

Шаг 1. Начните с решения

Вы можете использовать компьютер, чтобы сгенерировать снимок экрана или скопировать решение из другой опубликованной игры, но это займет всего несколько минут, чтобы сделать его вручную. (Есть 6, 670, 903, 752, 021, 072, 936, 960 возможных экранов. Вам просто нужно найти один).

  1. Нарисуйте холст 9×9, состоящий из 9 ячеек 3×3.
  2. Используйте карандаш. Это лучше, чем использовать ручку, так как вы неизбежно сделаете ошибку и так будет легче исправить.
  3. Поставьте цифру 1 в любой квадрат, если вы соблюдаете правила судоку.
  4. Повторяйте этот шаг, пока не получите цифру 1 в каждой строке, столбце и ячейках размером 3×3.
  5. Повторите этот шаг с номерами от 2 до 9. В это время вы можете застрять. Если это произойдет, отмените ошибку, изменив любую цифру, которая вызывает проблему. Попробуйте переместить пару одинаковых цифр из двух углов прямоугольника в углы того же прямоугольника, если оба все еще открыты. Попробуйте поменять местами три цифры строки или столбца в любой ячейке 3×3. Если это решает проблему и не вызывает другой, продолжайте.

    Создайте судоку, шаг 2

    Создайте судоку, шаг 2

    Шаг 2. Произведите случайное изменение экрана решения

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

    • Поменяйте местами строки 1-3, 4-6 или 7-9.
    • Поменяйте местами столбцы 1-3, 4-6 или 7-9.
    • Поменяйте местами блоки 3х9 рядов.
    • Поменяйте местами блоки столбцов 9×3.
    • Поверните экран на 90, 180 или 270 градусов.
    • Инвертируйте экран по горизонтали, вертикали или даже диагонали.
    • Поменяйте местами цифры.

    Создание судоку. Шаг 3

    Создание судоку. Шаг 3

    Шаг 3. Удалите все цифры, которые могут быть образованы из оставшихся цифр

    Удалите хотя бы по одному из каждой строки, столбца и блока.

    Создание судоку. Шаг 4

    Создание судоку. Шаг 4

    Шаг 4. Пока вы продолжаете усложнять игру, удаляя больше цифр, проверьте, сможете ли вы решить эту проблему

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

    Создайте судоку. Шаг 5

    Создайте судоку. Шаг 5

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

    Если вас устраивает, сохраните и поделитесь с миром.

    Создайте непревзойденный судоку

    Создайте непревзойденный судоку

    Шаг 6. Готово

    подсказки

    • Судоку можно сократить примерно до 20-30 подсказок.
    • Некоторые ассемблеры судоку предпочитают игры, в которых ячейки имеют симметрию вращения на 180 градусов. В этом случае при удалении цифр на шаге 3 удалите пары цифр на противоположной диагонали.
    • Существует множество разновидностей судоку, и большинство приведенных здесь инструкций легко обобщить. Решатель Scanraid поддерживает наиболее распространенные варианты, но если вы хотите поэкспериментировать с более неясным, вам придется либо сделать это вручную, либо создать свой собственный решатель.
    • Есть несколько компьютерных программ, которые создают игры Судоку, но лучшие коллекции сделаны вручную.

Понравилась статья? Поделить с друзьями:
  • Как найти экзоскелет на чаэс
  • Как найти длину окружности если радиус 125
  • Как найти скидку на покупку
  • Как найти морского императора в сабнатике
  • Как найти радиус вписанного шара в параллелепипеде