Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.41.219] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте!
Есть такая игра Blocks. Для ее написания нужно продумать следующий алгоритм. ??? Имеется массив - array[10][10]; Надо в россыпную заполнить его парами значений от 0 до 49. Если кто играл в эту игру, то поймет о чем я. Одним словом там должно быть два нуля, две единицы, две двойки ... и т.д. до 49. Но только в случайном порядке, в разброс. Если есть идеи, буду очень признателен. |
Сообщ.
#2
,
|
|
|
Надеюсь, ты не спрашиваешь про выбор алгоритма рандомизации, а про то, как заполнять поля. В общем заметь, что всё равно, как ты будешь заполнять — выбирая место в массиве 10х10 или в строке 100. А по сему предлагаю сделать листинг из ста елементов, и каждому числу по порядку определить место. Почему лист? чтобы можно было удобно выбросить элемент, после того, как его выбрали.
|
Сообщ.
#3
,
|
|
|
Спасибо. Я конечно же не спрашивал про алгоритм рандомизации. Я делал по другому. Создавал одномерный массив array[100] и заполнял одну его половину цифрами от одного до 49, а потом вторую половину. Потом несколько тысяч раз менял местами случайные элементы всего массива. Как будто тасуется колода карт. Способ с list тоже интересен. Попробую.
|
Сообщ.
#4
,
|
|
|
Цитата voidman, 23.09.02, 02:15:43 Спасибо. Я конечно же не спрашивал про алгоритм рандомизации. Я делал по другому. Создавал одномерный массив array[100] и заполнял одну его половину цифрами от одного до 49, а потом вторую половину. Потом несколько тысяч раз менял местами случайные элементы всего массива. Как будто тасуется колода карт. Способ с list тоже интересен. Попробую. Странно... А чего бы не написать процедуру AddValue(const n: integer), которая вставляет число в случайное свободное место, а потом вызвать ее в цикле for i:=1 to 49 do begin AddValue(i); AddValue(i); end; procedure AddValue(const n: integer); var i,j: integer; begin i := 1 + Random(100); j := 1 + Random(100); if GlobalArray[i,j] = 0 then GlobalArray[i,j] := n else AddValue(n); end; Предполагается, что в начале GlobalArray[1..100, 1..100] заполнен нулями. |
Сообщ.
#5
,
|
|
|
Цитата S.Yu.Gubanov, 23.09.02, 10:04:16 Странно... А чего бы не написать процедуру AddValue(const n: integer), которая вставляет число в случайное свободное место, а потом вызвать ее в цикле for i:=1 to 49 do begin AddValue(i); AddValue(i); end; procedure AddValue(const n: integer); var i,j: integer; begin i := 1 + Random(100); j := 1 + Random(100); if GlobalArray[i,j] = 0 then GlobalArray[i,j] := n else AddValue(n); end; Предполагается, что в начале GlobalArray[1..100, 1..100] заполнен нулями. Извиняюсь, размеры массива попутал, и то, что в цикле надо идти с i:=0, а не 1...сорри |
Сообщ.
#6
,
|
|
|
Теоретически этот алгоритм может работать вечно — если каждый раз будет выбирать уже заполненное место. Представь, что осталось одно-два места и тебе надо в них "попасть". Некрасиво получается.
|
Сообщ.
#7
,
|
|
|
Цитата TrivialCore, 23.09.02, 13:21:13 Теоретически этот алгоритм может работать вечно — если каждый раз будет выбирать уже заполненное место. Представь, что осталось одно-два места и тебе надо в них "попасть". Некрасиво получается. Вы правы. Если свободных мест мало, то процедура AddValue будет рекурсивно вызываться очень долго. Но в этом конкретном случае надо же заполнить 50 мест из 10*10 = 100, т.е. как минимум половина мест всегда свободна, а значит AddValue будет рекурсивно вызываться максимум пару тройку раз... |
Сообщ.
#8
,
|
|
|
Цитата S.Yu.Gubanov, 23.09.02, 16:55:47 Вы правы. Если свободных мест мало, то процедура AddValue будет рекурсивно вызываться очень долго. Но в этом конкретном случае надо же заполнить 50 мест из 10*10 = 100, т.е. как минимум половина мест всегда свободна, а значит AddValue будет рекурсивно вызываться максимум пару тройку раз... Насколько я понял, заполняются все поля (50*2) . |
Сообщ.
#9
,
|
|
|
Цитата TrivialCore, 23.09.02, 17:13:31 Насколько я понял, заполняются все поля (50*2) . А, блин, точно... моя прога не годится. |