Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2013, 14:17   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Судоку, генерация матрицы

Доброго времени суток.
Я знаю, что эта тема - дикий баян, но я взялся за свой генератор, у меня есть готовый код, и я пришёл сюда за помощью.
Мой генератор полностью должен генерировать "выигранное" поле судоку, дальше, я думаю, понятно.
Моя проблема заключается в том, что этот генератор зависает, вот я и пришёл за помощью. Ниже будет приведён код, помогите пожалуйста его поправить ...

Описаний много, но они разжёваны, пожалуйста, не игнорируйте.

Сразу скажу, простите за использование метки и операторов GOTO, но в моём случае это упростит код от пяти-вложенных циклов.

Код:
  for i:=1 to 9 do
    for g:=1 to 9 do begin
      
      new: // это та самая метка
      rand:=random(9)+1; // получение случайного числа
      check:=false; // "маяк" для перехода на метку
      
      for j:=1 to i do
        if (GMatr[j,i]=rand) then begin // проверка по строке
          check:=true; // "маяк"
          break;
        end else;
      if (check) then goto new else; // переход по "маяку"
      
      for j:=1 to g do
        if (GMatr[g,j]=rand) then begin // проверка по столбцу
          check:=true; // "маяк"
          break;
        end else;
      if (check) then goto new else; // переход по "маяку"
      
      r:=i; while not(r in [1,4,7]) do dec(r);
      c:=g; while not(c in [1,4,7]) do dec(c); // r и c - глобальные, потом расскажу
      if (square_search(rand)) then goto new else; // об этой функции тоже позже

      GMatr[i,g]:=rand; r:=0; c:=0; // запись в матрицу

    end;
Так вот, переменные r (row) и c (cols) - это переменные типа byte, у который есть пока два назначения:

---Это должен быть спойлер---

1) В данном случае определять, в каком квадрате 3x3 общей матрицы происходит проверка чисел, ввод и подобные операции (если не понятно - одно из правил судоку, не должно быть повтора в квадрате 3x3, этот квадрат я и определяю);
2) Просто обозначают, в какой ячейке происходит операция ввода (это нужно потому что мой интерфейс построен на canvas'е компонента TImage, а тут уже долго объяснять)

---Тут спойлер должен был закончиться---

Функция "square_search(rand)", возвращающая результат типа boolean, должна выполнять поиск (полученного случайного) числа в квадрате, в котором должна произойти запись. Код этой функции выглядит так:

Код:
function square_search(number:byte):boolean;
var i,g:byte;
begin
  result:=false;
  for i:=r to r+2 do
    for g:=c to c+2 do
      if (GMatr[i,g]=number) then begin
        result:=true; exit;
      end else;
end;
Для этого первый случай использования глобальных переменных r и c.

Собственно, объяснения на этом закончились.
Теперь вопрос: помогите пожалуйста разобраться, в чём проблема ?
Когда пол часа сидел в отладке - этот генератор записал мне в строку два одинаковых числа. Я ничего не понял и лёг спать.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.10.2013, 18:48   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
  if (GMatr[j,i]=rand) then begin // проверка по строке
  if (GMatr[g,j]=rand) then begin // проверка по столбцу
     GMatr[i,g]:=rand; r:=0; c:=0; // запись в матрицу
медитация на этими тремя строчками
или дать другие имена для i, g (row | col к примеру)

if (check) then goto new else; // переход по "маяку"
Цитата:
простите за использование метки и операторов GOTO, но в моём случае это упростит код от пяти-вложенных циклов
Код:
if check then continue;  // и goto нет
Цитата:
первый случай использования глобальных переменных r и c.
Код:
function square_search(startrow, startcol: byte; number:byte):boolean;
и нет нужды в глобальности
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.10.2013 в 18:55.
evg_m вне форума Ответить с цитированием
Старый 12.10.2013, 20:19   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

evg_m, оператор continue увеличивает такт цикла (счётчик) на единицу. Мне же нужна привязка к i и g, которые я перезаписывать не могу, только если перекодить в цикл while, тем самым усложняя обработку счётчика => больше кода.
По поводу медитации - спасибо, уже увидел.
Глобальные переменные используются в трёх процедурах и двух обработчиках синхронно - изменяя данные в одном обработчике они последовательно используются в другом, а именно: при нажатии на TImage переводится из пикселей (где было нажатие клавиши мыши) в столбец и строку в матрице, а после ввода цифры эти два числа используются для обращения в матрицу и, соответственно, запись введённой цифры.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.10.2013, 20:50   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Я бы создал числовой ряд из 9 чисел, 0 использовал бы в качестве пустого места. Таких радов так же 9. Затем сформировал бы матрицу 9x9, визуально разделив на отдельные 3x3 квадраты. И не надо никаких циклов.
Человек_Борща вне форума Ответить с цитированием
Старый 12.10.2013, 21:36   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Человек_Борща, не уловил сути вашего сообщения ... Можете пожалуйста объяснить подробнее ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.10.2013, 14:14   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Глобальные переменные используются в трёх процедурах и двух обработчиках синхронно - изменяя данные в одном обработчике они последовательно используются в другом,
и всюду их можно и нужно передавать явно.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Судоку FILA Общие вопросы Delphi 2 20.09.2013 22:48
Судоку на C++ Logg Помощь студентам 0 20.01.2013 15:39
Переделать обычное судоку в судоку чёт-нечёт Dark Illusion Общие вопросы Delphi 0 28.03.2012 20:33
судоку sergio11 C# (си шарп) 8 09.04.2011 21:33
Судоку zmey31313 Софт 7 13.05.2010 16:12