Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заполнение двумерного массива [D7, 2000, XP]


pavel_guzhanov ©   (2006-09-11 16:12:00) 

Помогите, что-то уже совсем сломал голову... Есть массив
var Numeral:array[1..5, 1..5] of integer;

Надо при загрузке программы заполнить его цифрами от 1 до 5, так чтобы Numeral[i,j] не повторялись ни по i, ни по j, т.е если представить массив в виде квадрата со сторонами 5х5, то чтобы по каждой горизонтали цифры не повторялись, и по каждой вертикали тоже. Надеюсь, что суть проблемы объяснил понятно :0))


evvcom   (2006-09-15 08:28:00) [1]

> [16] Barloggg   (12.09.06 17:26)

Держи задачку:
-6- 1-- 75-
--- --- 2-8
9-- --- 614

-95 3-- ---
--- 2-8 ---
--- --7 18-

679 --- --1
1-8 --- ---
-24 --3 -7-
успехов с бумажкой :)


evvcom   (2006-09-12 18:35:00) [2]

> [16] Barloggg   (12.09.06 17:26)

И все? :-)))
Эту рутину Simple Sudoku делает за тебя, отображая в каждой пустой клетке возможные варианты цифр. Кроме того, дает тебе возможность из этих вариантов исключить что-либо еще на основании твоих умозаключений. Позволяет выделять цветом все ячейки, в которых может быть, например, 1. И даже после всего этого сервиса над некоторыми задачками приходится долго пыхтеть, выискивая фигуры, на основании которых ты однозначно можешь исключить из какой-либо ячейки цифру.
Я после газетных задач тоже сначала было подумал, что здесь все элементарно. Потом как-то наткнулся на задачу, которую не получалось решить без перебора. Поискал в интернете, нашел эту прогу. Она показала мне на той задаче несколько вариантов решений. Я стал решать задачки из ее коллекции и только тогда понял, что не все так просто.
Сегодня нет, а завтра вечерком подберу тебе пару задачек на разные фигуры, над которыми ты "умрешь" со своими матрицами. И только почитав о способах поиска решения, ты сможешь их решить.


Barloggg   (2006-09-12 17:26:00) [3]

все очень просто.
выписываешь в центр листа исходную матрицу.

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

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

конечно тоже можно запутаться, если постараться...

я очень долгое время развлекался на так называемых "японских сканвордах"... это как раз тот метод.


evvcom   (2006-09-12 16:04:00) [4]

> [14] Barloggg   (12.09.06 15:35)

Рандомизатором, вероятно, ты нескоро выйдешь на твердый орешек.
Тот Simple Sudoku имеет готовые задачи, названные по методам, которые используются при их решении, а также есть рандомизатор, но с 5 опциями вплоть до эксперт и экстрим. Вот на этих уровнях бывает долго ищешь решение. Но я получается решал их "в лоб", без матриц. С матрицами пока идею не понял, что в них должно быть.


Barloggg   (2006-09-12 15:35:00) [5]

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

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

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

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


evvcom   (2006-09-12 09:12:00) [6]

> [12] Barloggg   (12.09.06 08:56)

Это ты о методах решения? Не боишься, что задачку подкину, что месяц будешь на бумажке обвязывать? И что значит "обвязывать" и "решать в лоб"? В чем разница?


Barloggg   (2006-09-12 08:56:00) [7]

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

ну, конечно если решать влоб то мозгами придется пошевелить ясно дело.


evvcom   (2006-09-12 08:50:00) [8]

> [10] pavel_guzhanov ©   (12.09.06 08:21)

Размещение фигня, вот алгоритмы поиска решения - вот это будет да... Ты все ж закачай себе Simple Sudoku и попробуй его порешать. Какие-нить multicolors или задачки уровня экстрим... То что печатают в газетах - для детского сада, здесь же ого-го задачки есть.


pavel_guzhanov   (2006-09-12 08:21:00) [9]


> На фига?


а нафига люди сапера пишут? Есть же уже, причем в windows входит. Еще люди часто пишут замену блокноту...
На самом деле, пока на работе появилось свободное время, решил поупражняться в игроделании. А судоку - все-таки достаточно хитрый алгоритм размещения придумать надо, интересно... Правда вот уже за помощью обратился сюда, видимо собственной хитрости не хватило :0))


MBo   (2006-09-11 17:18:00) [10]

Существует 161280 таких квадратов...


evvcom   (2006-09-11 16:48:00) [11]

> [5] pavel_guzhanov ©   (11.09.06 16:20)

На фига? Уже есть классный Simple Sudoku :-)


Наиль   (2006-09-11 16:21:00) [12]

for i := 1 to 5 do
for j := 1 to 5 do Numeral[i,j] := (i+j-1) mod 5 +1;


Barloggg   (2006-09-11 16:20:00) [13]

элементарно.
ответ вот:
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4

код вот
for i := 1 to 5 do begin
  Counter := i;
  for j := 1 to 5 do
  begin
    Numeral[i,j] := Counter;
    Inc (Counter)
    if counter>5 then counter:=1;
  end;
end;


pavel_guzhanov   (2006-09-11 16:20:00) [14]


> Судоку изобретаешь ?)


ага... на досуге :0))


Barloggg   (2006-09-11 16:18:00) [15]

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


Сергей М.   (2006-09-11 16:17:00) [16]

Судоку изобретаешь ?)


Джо   (2006-09-11 16:15:00) [17]

> заполнить его цифрами от 1 до 5

А, вот этого-то я и не заметил :)


Джо   (2006-09-11 16:14:00) [18]

 Counter := 0;
 for i := 1 to 5 do
   for j := 1 to 5 do
   begin
     Numeral[i,j] := Counter;
     Inc (Counter)
   end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо