Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 09.05.2014
Сообщений: 5

Возможно ли написать программу для решения Судоку?

28.10.2009, 08:03. Показов 6132. Ответов 3
Метки нет (Все метки)

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

Судоку состоит из 9-ти строк и 9-ти столбцов, есть еще цепочки из 9-ти чисел.

Вот пример(прикрепленный файл):

Кликните здесь для просмотра всего текста
Х11 Х12 Х13 Х14 Х15 Х16 Х17 Х18 Х19

Х21 Х22 Х23 Х24 Х25 Х26 Х27 Х28 Х29

Х31 Х32 Х33 Х34 Х35 Х36 Х37 Х38 Х39

Х41 Х42 Х43 Х44 Х45 Х46 Х47 Х48 Х49

Х51 Х52 Х53 Х54 Х55 Х56 Х57 Х58 Х59

Х61 Х62 Х63 Х64 Х65 Х66 Х67 Х68 Х69

Х71 Х72 Х73 Х74 Х75 Х76 Х77 Х78 Х79

Х81 Х82 Х83 Х84 Х85 Х86 Х87 Х88 Х89

Х91 Х92 Х93 Х94 Х95 Х96 Х97 Х98 Х99

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

Х11-Х22-Х33-Х34-Х44-Х55-Х46-Х37-Х27

Х12-Х21-Х31-Х32-Х41-Х42-Х43-Х53-Х54

Х13-Х14-Х23-Х24-Х15-Х25-Х35-Х45-Х16

Х17-Х26-Х36-Х47-Х38-Х56-Х65-Х76-Х86

Х18-Х19-Х29-Х28-Х39-Х48-Х57-Х58-Х49

Х59-Х69-Х68-Х79-Х89-Х78-Х77-Х67-Х66

Х98-Х99-Х88-Х87-Х97-Х96-Х95-Х84-Х93

Х94-Х85-Х75-Х74-Х73-Х83-Х72-Х81-Х92

Х91-Х82-Х71-Х61-Х51-Х62-Х63-Х52-Х64

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

Х11 Х12 Х13 Х14 Х15 Х16 Х17 Х18 Х19

Х21 Х22 Х23 Х24 Х25 Х26 Х27 Х28 Х29

Х31 Х32 Х33 Х34 Х35 Х36 Х37 Х38 Х39

Х41 Х42 Х43 Х44 Х45 Х46 Х47 Х48 Х49

Х51 Х52 Х53 Х54 Х55 Х56 Х57 Х58 Х59

Х61 Х62 Х63 Х64 Х65 Х66 Х67 Х68 Х69

Х71 Х72 Х73 Х74 Х75 Х76 Х77 Х78 Х79

Х81 Х82 Х83 Х84 Х85 Х86 Х87 Х88 Х89

Х91 Х92 Х93 Х94 Х95 Х96 Х97 Х98 Х99

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
uses
  CRT;
 
const
  N=9;
  M=3;
 
type
  tCell=0..N;
  tBoard=array[1..N,1..N] of tCell;
  tList=set of tCell;
 
var
  Board:tBoard;
 
const
  Lev:integer=0;
  t:LongInt=0;
  Stop:boolean=true;
 
procedure ShowBoard(Brd:tBoard; k,l:tCell; t:LongInt);
var
  i,j,Bac:integer;
begin
  for i:=0 to N+1 do begin
    for j:=0 to N+1 do begin
      if i*j*(i-N-1)*(j-N-1)=0 then begin
        TextBackGround(7);Write('  ');
        if (t<>0)and(i=0)and(j=N+1) then begin
          TextColor(7); TextBackGround(0);
          Write(' Solution ',t);
        end
      end
      else begin
        if Odd(Pred(i) div M+Pred(j) div M) then Bac:=0 else Bac:=1;
        TextColor(7);TextBackGround(Bac);
        if Brd[i,j]=0 then Write('  ') else begin
          Write(' ');
          if (i=k)and(j=l) then begin
            TextColor(15);TextBackGround(5);Write(Brd[i,j]);
          end
          else Write(Brd[i,j])
        end
      end
    end;
    TextBackGround(0);
    WriteLn
  end;
  WriteLn;
  if KeyPressed or Stop then case ReadKey of
    #27:Halt;
    ' ':Stop:=not Stop
  end
end;
 
procedure ReadBoard(FNam:string);
var
  i,j:integer;
  s:string;
  f:text;
begin
  Assign(f,FNam);ReSet(f);
  for i:=1 to N do begin
    ReadLn(f,s);
    for j:=1 to N do if j<=Length(s) then case s[j] of
      '0'..'9':Board[i,j]:=Byte(s[j])-48;
      else Board[i,j]:=0
    end
    else Board[i,j]:=0
  end;
  Close(f)
end;
 
function Solve(Brd:tBoard):boolean;
var
  a,b,c, i,j, Mi,Mj, Total,TotalMax:integer;
  Sol,NoWay,Done,Mult:boolean;
  List,MList:tList;
 
  procedure Cross(i,j:integer);
  var
    k,l:integer;
 
    procedure FillList(Cell:tCell);
    begin
      if not (Cell in List) then begin
        List:=List+[Cell];
        Inc(Total);
        NoWay:=NoWay or(Total=9);
      end
    end;
 
  begin
    for k:=1 to N do begin
      FillList(Brd[k,j]);
      FillList(Brd[i,k]);
    end;
    for k:=Succ(a) to a+M do for l:=Succ(b) to b+M do FillList(Brd[k,l]);
  end;
 
begin
  Inc(Lev);
  Sol:=false;
  NoWay:=false;
  repeat
    Mult:=true;
    Done:=true;
    TotalMax:=0;
    for i:=1 to N do for j:=1 to N do if Brd[i,j]=0 then begin
      Done:=false;
      a:=Pred(i) div M*M;
      b:=Pred(j) div M*M;
      Total:=0;
      List:=[0];
      Cross(i,j);
      if Total=8 then begin
        c:=1;
        while c in List do c:=c+1;
        Brd[i,j]:=c;
        Mult:=false;
{        ShowBoard(Brd,i,j,0)}
      end
      else if Total>TotalMax then begin
        TotalMax:=Total;
        Mi:=i;Mj:=j;
        MList:=List
      end
    end;
  until Mult or Done or NoWay;
  if NoWay then Solve:=false
  else if Done then begin
    Solve:=true;
    Inc(t);
    ShowBoard(Brd,0,0,t)
  end
  else for i:=1 to N do if not(i in MList) then begin
    Brd[Mi,Mj]:=i;
    Sol:=Solve(Brd) or Sol;
    Solve:=Sol
  end;
  Dec(Lev)
end;
 
begin
  ReadBoard('sudoku.dat');
  ShowBoard(Board,0,0,0);
  if Solve(Board) then WriteLn('Done.') else WriteLn('No Way!');
  ReadLn
end.
Алгоритм такой - берем перекрестье каждой строки с каждым столбцом, и смотрим набор цифр, который они содержат.
Если в нем не хватает ровно одной цифры - вписываем ее в пересечение.
Могут быть и другие алгоритмы, это лишь один из возможных.
Одним шагом считается полный проход по полю, если за шаг находятся несколько таких цифр - ставятся все.
Если не будет найдено ни одной, программа выдаст сообщение "множественный выбор" и остановится.
Смысл в том, что нужно пробовать несколько разных вариантов.

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

Вот образец содержимого файла sudoku.dat. Важно: файл позиционный, то есть цифры сдигать нельзя.
Более того, в строчке должны обязательно присутствовать все девять знаков (цифры и пробелы) - закрасьте приведенный пример блоком,
чтобы увидеть пробелы, присутствующие там. Цифра обозначется цифрой, пустое место - пробелом или любым знаком (не цифрой или нулем).
Лишних пробелов тоже быть не должно!

8 2
51 3
4 9 63
53 7
8 96
7 9
6 5 1
3 4
1 8 2

Если трудно увидеть пробелы
--8---2--
-51-3----
4--9-63--
53--7----
---8--96-
-7---9---
-6-5--1--
--3---4--
-1--8--2-

Но когда будете задавать параметры нужно писать без пробелов!!!

Эта программа отлично работает.

ПОМОГИТЕ ПОЖАЛУЙСТА ПЕРЕПИСАТЬ ПРОГРАММУ ТАК, ЧТОБЫ ОНА МОГЛА РЕШАТЬ СУДОКУ С ЦЕПОЧКАМИ.
Миниатюры
Возможно ли написать программу для решения Судоку?  
Вложения
Тип файла: txt Программа для обычного судоку.txt (3.0 Кб, 171 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2009, 08:03
Ответы с готовыми решениями:

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

Написать программу для судоку-цепочки(9*9)
Судоку-цепочки - представляет собой квадрат, состоящий из кружков. Необходимо расставить в кружках цифры так, чтобы в каждой горизонтали и...

Написать программу для решения s=A0+A1*x+A2*x2+...+An*xn
Как будет выглядеть блок-схема и программа на языке Паскаль для решения s=A0+A1*x+A2*x2+...+An*xn? Добавлено через 2 часа 50 минут ...

3
Босс
 Аватар для sheka
161 / 126 / 10
Регистрация: 03.06.2009
Сообщений: 750
28.10.2009, 15:27
интересно узнать: в любом ли судоку, которое имеет единственное решение, должна находится клеточка, которую можна заполнить единственным способом?
когда-то делал программу на паскале: решала перебором (макс 0.11) секунд, поэтому с такой проблемой не сталкивался.

цепочка должна задаваться до выполнения программы или во время?
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
28.10.2009, 22:53
Алгоритм такой - берем перекрестье каждой строки с каждым столбцом, и смотрим набор цифр, который они содержат.
Если в нем не хватает ровно одной цифры - вписываем ее в пересечение.
Могут быть и другие алгоритмы, это лишь один из возможных.
Халтура, а не алгоритм.
Он не решит большую часть судоку.
в любом ли судоку, которое имеет единственное решение, должна находится клеточка, которую можна заполнить единственным способом?
Вопрос нужно задавать так - всегда ли решит приведенный алгоритм судоку ?

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

Проверяем стек ответов.
Либо нет ответов,
либо один ответ,
либо много ответов.
0
0 / 0 / 0
Регистрация: 07.02.2011
Сообщений: 3
08.02.2011, 01:07
мое решение на Java: http://sites.google.com/site/sudokujavasolution/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2011, 01:07
Помогаю со студенческими работами здесь

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

Написать программу для решения функции
Програма для решения функции

Написать программу для решения задачи
Написать программу для решения задачи из определенной предметной области. Дано натуральное число n (n ≤ 100). Определить: ...

Написать программу для решения уравнения на С++
Всем привет!!) Помогите с написанием программы для решения уравнения на C++. Буду очень благодарен) z = \frac{sin({x}^{2})}{1 + cos(x)}...

Написать программу для решения выражения
Написать программу для решения выражения: https://www.cyberforum.ru/attachment.php?attachmentid=1088834&amp;stc=1&amp;d=1574948651 заранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru