Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  08:31[Войти] | [Зарегистрироваться]
Ответ на вопрос № 44645

Головоломки и алгоритмические задачки | 23-08-2006 01:02
Вопрос для проекта "Головоломки".
Вероятно, все знают, что такое судоку.
(На всякий случай: матрица 3 на 3 из массивов 3 на 3 (рассматриваемая также как матрица 9 на 9 из цифр 1..9) заполняется цифрами 1..9, причём:
- в каждом массиве цифра 1..9 встречается единожды
- в каждой строке матрицы цифра 1..9 встречается единожды
- аналогично для столбцов)
А вот знает ли кто-нибудь алгоритм генерации таблиц-судоку? Несомненно, метод прямого перебора работает, да только мой процессор этого не выдерживает.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

11-12-2009 05:20 | Комментарий к предыдущим ответам
странно... написал генератор в лоб. т.е. перебор, по сути
1000 судоку генерит за 3 секунды.

28-10-2009 03:15 | Комментарий к предыдущим ответам
Есть вероятность, что за 3 года автор вопроса так и не нашёл решения? ;)

27-10-2009 16:03 | Комментарий к предыдущим ответам
Вот тут расписан отлично и быстро работающий алгоритм:
http://malover.ucoz.ru/sudoku
Генерация происходит отдельными блоками, а не поэлементно. Читайте, короче (способ 3).

26-08-2008 06:18 | Комментарий к предыдущим ответам
http://mozyr.by/i/danemon/games/sudoku_generate.php

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

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

Карта - это строка типа 'abcdefghi', затем случайным образом буквы заменяются на цифры.

Что интересно, вариантов замены символов из строки 'abcdefghi' на цифры аж больше 350 тысяч.
(9*8*7*6*5*4*3*2*1=362880)

У меня таких карт восемь. Мог бы и восемь тысяч таких наделать, но генерация с чистого листа перспективнее. Поленился, то бишь.

Карты:
hgifeadcb/fecdgbaih/dbacihgef/idbghcfae/cahbfeidg/gfeadihbc/ecgiafbhd/bidhcgefa/ahfebdcgi
ifcdbgeah/eadcihbgf/hbgafedic/beaghfcdi/dcieabhfg/ghfidcaeb/fdhbgaice/cibfedgha/agehcifbd
bahdfgcei/igfchebda/edcbiahgf/gbefdcaih/hfaiebdcg/dcigahfbe/figacdehb/ahdebigfc/cebhgfiad
gefadbhic/dcbihgafe/aihefcdgb/bhadiefcg/fgehcabdi/idcgbfeah/hagcedibf/cbifahged/efdbgicha
iadchgbfe/bhgfaecdi/cefdbiagh/hiagebfcd/dfbicheag/egcadfhib/gbihfcdea/achegdibf/fdebiaghc
hgacbdefi/idbfegach/cefihadbg/gbhdiecaf/afihcbgde/dceagfihb/bhceaifgd/figbdchea/eadgfhbic
beghfdcia/dficagebh/acheibdgf/fgcbheadi/idbagfhec/ehadcigfb/cbdfeaihg/hiegbcfad/gafidhbce
hcbgeaifd/adichfgbe/gefidbach/ibdfcehga/fgahbdeic/ehcaigbdf/bahdgcfei/digefhcab/cfebaidhg

Кстати, страничку решалки судоку переименовал:
http://test1.ru/games/sudoku_solve.php

14-08-2008 16:33 | Комментарий к предыдущим ответам
Кажется я придумал вполне простой в плане программирования алгоритм создания исходных таблиц судоку. Из них потом можно убирать циферки и головоломка готова. Все пока еще в процессе, обязательно отпишусь.
Будет настроение - даже исходник дам и объясню как это работает.

12-08-2008 18:00
http://www.mozyr.by/i/danemon/games/sudoku.php

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

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

26-05-2008 06:57 | Комментарий к предыдущим ответам
Как-то хотел я такую программулечку сделать, да все времени нет. Но делал бы так. Вводим следующие основные операции:
1. анализ строки
2. анализ столбца
3. анализ квадрата 3х3
Анализ заключается в переборе свободных клеток в объекте и попытке записать в клетку все недостающие числа. Как только число подбирается или все числа перебраны - переходим к следующей клетке. При проверке, может ли число находиться в клетке делаем:
1. при анализе строки - наличие числа в столбце и в квадрате
2. при анализе столбца - наличие числа в строке и в квадрате
3. при анализе квадрата - наличие числа в столбце и в строке
На каждом шаге:
1. запускаем анализ всех строк
2. запускаем анализ всех столбцов
3. запускаем анализ всех квадратов
(порядок может быть любым)
и циклим это все, пока не останется незаполненных клеток.
Примерно так сам и решаю. Берем клетку. Смотрим: 1 можно вставить? Можно - вставляем и идем к следующей. Иначе: 2 можно - да/нет. 9 можно = да/нет. Если 9 - нет, то оставляем клетку пустой. Человек, правда, подходит более интелеектуально в ряде случаев, но и эти случаи можно запрограммировать.
Однако, такой подход не пройдет для некоторых сложных вариантов, когда все возможные клетки заполнены, а оставшиеся нельзя заполнить, пока в какую-то из оставшихся не вставишь число, которое скорее всего должно там быть (я такие называю вероятностными клетками). Если угадал число правильно, то все решается нормально. Если неправильно - вставляем другое число или число в другую клетку и повторяем все заново.
Надеюсь идею описал более-менее понятно. :)

04-08-2007 11:50 | Комментарий к предыдущим ответам
По составлению программы-судоку вполне можно использовать алгоритм Андерсена (если скляроз в отлучке). Суть метода такова:
1.- для начально заданной матрицы составляем массивы степеней свободы для строк (во сколько клеточек в строке можно воткнуть данную цифру) и сттолбцов (то же самое, но для столбцов);
2.- сортируем суммы степеней свободы для каждой клетки матрицы (столбец+строка);
3.- выбираем миниммальную сумму (положительную - в идеале - 2=1+1 :) );
4.- тыкаем туда число;
5.- пересчитываем матрицу и соответственно суммы для клеток;
6.- переходим к шагу 3.

Есть небольшой ньанс: при попадании в столбец или строку цифры 0 - данная клетка не может быть заполнена. Эту проверочку нужно предусмотреть.

Данный алгоритм часто используется при решении олимпиадных задач. Так например задача "Острова" - более известная как японский сканводр - решалась именно им :) Ну и там ферзи всякие и т.п.

12-07-2007 07:23 | Комментарий к предыдущим ответам
Я в свое время написал программу для решения судоку 4х4 ( =) ), 9х9 и 16х16.
Использовал только логику ну и (там, где логика сдавалась), перебор.
В принципе работало это очень быстро.

19-05-2007 18:06 | Комментарий к предыдущим ответам
Если оставлять от rnd открытые ячейки, то игра будет иметь решения :
... 18 открытых ячеек - более 150 решений
    27                  более 100 решений


Пишут, что можно решать (и генерировать) судоку методом раскраски графа:
http://en.wikipedia.org/wiki/Algorithmics_of_sudoku
Кстати, там же приведен пример для 17-ти открытых клеток (в головной статье написано, что 17 - это пока наименьшее известное на данный момент число открытых клеток, дающее единственное решение).

21-10-2006 01:11 | Комментарий к предыдущим ответам
А еще интересней, как открыть в сгенеренной таблице цифры так, чтобы решение было единственный.
Если оставлять от rnd открытые ячейки, то игра будет иметь решения :
... 18 открытых ячеек - более 150 решений
    27                  более 100 решений
    36                  более 30 решений
    45                  единицы решений
    54                  единственное решение

24-08-2006 14:05 | Сообщение от автора вопроса
Спасибо, Panda!
Работает даже быстрее, чем я думал...
До этого генерировал ламерским способом: отражал и поворачивал две несчастные таблицы (из двух сделал 10). Удивительно, но никто не пожаловался на однообразие - наверное, из-за случайного определения известных с самого начала значений.

23-08-2006 02:58
В Интере есть рекомендации как решать судоку
http://ru.wikipedia.org/wiki/%D0%A1%D1%83%D0%B4%D0%BE%D0%BA%D1%83
http://www.biblprog.org.ua/pages_ru/pages_prog_ru/simple_sudoku.html
По рекомендациям можно написать программку.

23-08-2006 02:26
А если делать перебор так: сгенерировать все множество массив 3х3 - их будет 9! = 362880. Это же множество можно использовать как возможные комбинации составления этих матриц между собой. После чего в цикле прогнать проверку на валидность каждой таблицы (проверку по строкам и полям).

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Кто съел Красную шапочку?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования