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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2015, 12:10   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию Заполнение массива не повторяющимися числами.

Доброго времени суток, уважаемые эксперты. Нужна Ваша помошь. Стоит задача заполнить массив разного размера (от 4х4 до 9х9). Он должен заполняться числами от 1 до размера массива (4-9). Заполнить массив нужно так, чтобы в строках числа не повторялись дважды и по столбцам не повторялись дважды, например так, но абсолютно случайно:

1234
4123
3412
2341

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

Мой алгоритм таков:

Код:

for j:=0 to Razmer-1 do
  begin
    for n:=1 to Razmer do
    begin
    u:=false;
      while u=False do
      begin
      i:=Random(Razmer);
        if (map[i,j]=0) then
        begin
          if j=0 then
          begin
          map[i,j]:=n;
          u:=True;
          end;

          if (j>0) then
          begin
          u:=True;
            for k:=0 to j do
            if map[i,k]=n then u:=False;

            if u=True then
            map[i,j]:=n;
          end;
        end;
      end;
    end;
  end;
Заранее спасибо всем за помощь.
Armageddets вне форума Ответить с цитированием
Старый 29.04.2015, 12:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
program Project1;
const n=10;
var i,j,k:integer;
begin
  k:=1;
  for i:=1 to n do begin
    for j:=1 to n do begin
      write(((i+j) mod n + 1):5);
    end; writeln;
  end; writeln;
  readln;
end.
Не? Единственное что не учитываю это случайность. Это важно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.04.2015, 13:25   #3
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

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

В любом случае спасибо, что откликнулся. А там посмотрю может быть доработаю твой алгоритм.
Armageddets вне форума Ответить с цитированием
Старый 29.04.2015, 13:38   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Armageddets, всё очень просто.
нужно
1) заполнить массив числами от 1 до N
2) перемешать массив случайным образом.

готовый код можно взять ТУТ

Добавлено
а нет. мой пост "мимо кассы"
я проглядел, что у Вас нужно заполнить матрицу особым образом!!

Последний раз редактировалось Serge_Bliznykov; 29.04.2015 в 13:41.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.04.2015, 14:14   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По-моему эта задача не решима. Коллизии все равно будут. Нужны дополнительные условия, ИМХО.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.04.2015, 14:31   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Заполни первую строку случайно. Дальше каждый столбец сверху вниз циклически в последовательности первой строки. Псевдо-случайность конечно, зато решаема.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.04.2015, 23:28   #7
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

С кучей проверок добился более менее приличного вида. Конечно может баги и будут случаться, но пока не заметил. Этот алгоритм мне нужен был для создания игры-головоломки Хитори. Спасибо всем, кто не остался равнодушен. Уже не раз меня спасали. Думаю тему можно закрывать.
Armageddets вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запонение массива случайными не повторяющимися числами SlayerLiving Общие вопросы C/C++ 3 27.01.2011 18:48
Заполнение массива неповторяющимися числами anybkarnak Общие вопросы C/C++ 8 30.11.2009 22:31
Заполнение массива случайными числами dee_lv Общие вопросы C/C++ 7 08.12.2008 21:22
Заполнение массива случайными числами Roomper Помощь студентам 4 12.05.2008 22:34
Заполнение массива числами Ermiss Общие вопросы C/C++ 7 25.11.2007 14:54