Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
ArHiMeD_LSD
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 2
#1

Судоку снежинка - Delphi

06.05.2014, 00:09. Просмотров 625. Ответов 1
Метки нет (Все метки)

Ребята, может кто писал или знает как писать программу этой головоломки, помогите)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 00:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Судоку снежинка (Delphi):

Переделать обычное судоку в судоку чёт-нечёт
Здравствуйте. Помогите, пожалуйста, переделать обычное судоку 9х9 в судоку...

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

Снежинка коха
В универе задали лабу. задание следующее: "построение снежинки коха". Дело в...

Судоку
Хочу написать программу которая генерирует все возможные варианты заполнения...

Судоку
Здравствуйте. Нужно реализовать приложение "Судоку", использую компонент...

Судоку
Надо написать программу, решающую судоку. Чтоб я вводила числа с клавы а прога...

1
teleprog
176 / 148 / 43
Регистрация: 14.08.2008
Сообщений: 1,212
06.05.2014, 02:02 #2
Лучший ответ Сообщение было отмечено ArHiMeD_LSD как решение

Решение

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

Delphi
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
type
  d9= set of 1..9;  // описание множества, в множестве нет сортировки,  к примеру множества [1,2,3] и [2,1,3] равны между собой
var 
    ar:array[1..9,1..9]of byte;   // массив для хранения промежуточных результатов игрового поля
 
..........................
//функция возвращает множество цифр,
//которое можно ввести в поле с координ-ми x y,
//используется для подсказки и для генерации новой карты
function TForm1.getVibor(x, y: byte): d9;
var i,j,ii,jj:byte;
s:string;
begin
  d1 := [1,2,3,4,5,6,7,8,9];//эталонное множество
 
  for i:=1 to 9 do  //проходим в цикле по СТОЛБЦУ и вычитаем из множества, содержащиеся в столбце цифры
    if ar[x,i]>0 then  d1:= d1-[ar[x,i]];
 
  for i:=1 to 9 do //проходим в цикле по СТРОКЕ и вычитаем из множества, содержащиеся в строке цифры
    if ar[i,y]>0 then  d1:= d1-[ar[i,y]];
 
  case x of  // определяем номер сектора по горизонтали
    1,2,3:ii:=0;
    4,5,6:ii:=3;
    7,8,9:ii:=6;
  end;
  case y of  // определяем номер сектора по вертикали
    1,2,3:jj:=0;
    4,5,6:jj:=3;
    7,8,9:jj:=6;
  end;
 
  for i:=1 to 3 do //проходим в цикле по СЕКТОРУ 3х3 и вычитаем из множества цифры,
  for j:=1 to 3 do                                               //    содержащиеся в СЕКТОРе
   if ar[ii+i,jj+j]>0 then d1:=d1-[ar[ii+i,jj+j]];
  getVibor:= d1;
end;
............................
 
 
// генерирует новую карту
procedure TForm1.GetRandomMap;
var n,i,j,k: byte;
  dd: d9;
  s: string;
  F:INTEGER;
begin
  randomize;
{алгоритм генерации новой карты основан на переборе,
т.е. строим по правилам новую карту, проверяем , если она нам неподходит строим следующую, и т.д.
 
для построения карты используется функция getVibor(x,y:byte):d9;
она возвращает множество цифр, которое можно ввести в поле с координ-ми x y,
 
таким образом мы перебираем все клетки в карте 9х9,
и пишем в клетку одну из цифр из подсказки которую дает ф-я getVibor,
если в подсказке нет ниодной цифры, то в клетку пишем ноль, и значит эта карта неявляется судоку.
}
 
  REPEAT //цикл
    F:=0;  //
    for i:=1 to 9 do
      for j:=1 to 9 do ar[i,j] := 0; // вначале проставили в карте все нули
 
    for i:=1 to 9 do
      for j:=1 to 9 do  //перебираем в цикле все ячейки в карте
    begin
      dd := getVibor(i,j);  // получаем подсказку - множество цифр которые по правилам судоку
                              // можно поставить в текущую ячейку
      s := '';
      for k:=1 to 9 do  //преобразовываем множество в строку
       if k in d1 then s:=s+inttostr(k);
 
      if length(s)>0 then  //если длина строки больше нуля, те в подсказке есть цифры...
      begin
        k := random(length(s))+1;  // то выбираем одну из них случайным образом
        ar[i,j] := strtoint(s[k]);  // и записываем в карту
      end;
    end;
 
    for i:=1 to 9 do
    for j:=1 to 9 do  IF AR[I,J] = 0 THEN INC(F); // посчитали кол-во незаполненных клеток (равных нулю)
  UNTIL F=0; //выполняем цикл генерации новых карт пока, ненайдем карту, без нулей
end;
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 02:02
Привет! Вот еще темы с решениями:

Игра Судоку
Здравствуйте. Может кто нибудь дать исходник игры Судоку (думаю о правилах игры...

Игра судоку на Delphi 7
Игра судоку на Delphi 7 В прошлом году делал курсовой проект для одного...

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

заполнить stringgrid по принципу судоку
заполнить stringgrid по принципу судоку. может у кого есть идеи, как это...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru