На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Игра Blocks
    Здравствуйте!

    Есть такая игра Blocks. Для ее написания нужно продумать следующий алгоритм. ???

    Имеется массив - array[10][10];

    Надо в россыпную заполнить его парами значений от 0 до 49.

    Если кто играл в эту игру, то поймет о чем я. Одним словом там должно быть два нуля, две единицы, две двойки ... и т.д. до 49. Но только в случайном порядке, в разброс.

    Если есть идеи, буду очень признателен.

      Надеюсь, ты не спрашиваешь про выбор алгоритма рандомизации, а про то, как заполнять поля. В общем заметь, что всё равно, как ты будешь заполнять — выбирая место в массиве 10х10 или в строке 100. А по сему предлагаю сделать листинг из ста елементов, и каждому числу по порядку определить место. Почему лист? чтобы можно было удобно выбросить элемент, после того, как его выбрали.
        Спасибо. Я конечно же не спрашивал про алгоритм рандомизации. Я делал по другому. Создавал одномерный массив array[100] и заполнял одну его половину цифрами от одного до 49, а потом вторую половину. Потом несколько тысяч раз менял местами случайные элементы всего массива. Как будто тасуется колода карт. Способ с list тоже интересен. Попробую.
          Цитата 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] заполнен нулями.
            Цитата 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...сорри
              Теоретически этот алгоритм может работать вечно — если каждый раз будет выбирать уже заполненное место. Представь, что осталось одно-два места и тебе надо в них "попасть". Некрасиво получается.
                Цитата TrivialCore, 23.09.02, 13:21:13
                Теоретически этот алгоритм может работать вечно — если каждый раз будет выбирать уже заполненное место. Представь, что осталось одно-два места и тебе надо в них "попасть". Некрасиво получается.

                Вы правы. Если свободных мест мало, то процедура AddValue будет рекурсивно вызываться очень долго. Но в этом конкретном случае надо же заполнить 50 мест из 10*10 = 100, т.е. как минимум половина мест всегда свободна, а значит AddValue будет рекурсивно вызываться максимум пару тройку раз...
                  Цитата S.Yu.Gubanov, 23.09.02, 16:55:47

                  Вы правы. Если свободных мест мало, то процедура AddValue будет рекурсивно вызываться очень долго. Но в этом конкретном случае надо же заполнить 50 мест из 10*10 = 100, т.е. как минимум половина мест всегда свободна, а значит AddValue будет рекурсивно вызываться максимум пару тройку раз...

                  Насколько я понял, заполняются все поля (50*2) ;).
                    Цитата TrivialCore, 23.09.02, 17:13:31

                    Насколько я понял, заполняются все поля (50*2) ;).

                    А, блин, точно...  моя прога не годится.
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0236 ]   [ 14 queries used ]   [ Generated: 18.05.24, 09:18 GMT ]