Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перестановки чисел 
:(
    Опции темы
Litanika
Дата 13.5.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2006

Репутация: нет
Всего: нет



Помогите запрограммировать такую штуку: вводится число классов, в каждом классе число элементов (например числа). Нужно получить строки заданной длины N из всевозможных перестановок этих чисел. Например, 4 класса, в них 2, 2, 1, 1 элементов: [1,1], [2,2], [3], [4], длина строки =3. Должно получиться: 
112
113
114
121
122
123
124
131
132
134
141
142
143
211
212
213
214
221
223
232
234
241
242
243
311
312
314
321
322
324
341
342
411
412
413
421
422
423
431
432
Вся проблема в том, что заранее неизвестна длина строки N, и поэтому нельзя сделать просто определенное число вложенных циклов. Помогите пожалуйста!! очень нужно, желательно на Delphi 
PM MAIL   Вверх
SoWa
Дата 13.5.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Просьба простить, код столетней давности, неоптимизированный и вырваный из кода.
Код

procedure cikl(n:integer;s:string);
var i:byte;k:string;
begin
 k:=s;
  if n>1 then
   for i:=1 to 255  do
    begin
       s:=s+chr(i);
       form1.listbox1.items.add(s);
       cikl(n-1,s);
       s:=k;
       form1.label1.Caption:=inttostr(strtoint(form1.label1.Caption)+1);
       SendMessage(form1.ListBox1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
    end;
end;
...
begin
cikl(2,''); {Если нужна строка длинны 1, то в параметре указывай на единицу больше. Ибо СРУК.}
end;
 
Код генерирует все строки заданной длинны из 255 символов. Можно заменить массивом символов. На ваше усмотрение. 

Это сообщение отредактировал(а) SoWa - 13.5.2006, 17:39


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Litanika
Дата 13.5.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2006

Репутация: нет
Всего: нет



SoWa
Это не совсем то, что мне нужно, но почти похоже на правду.
Этот способ перебирает ВСЕ сочетания, а у меня количество элементов каждого типа ограничено, например если в твоем примере взять не символы , а цифры, и например будет комбинация 444, то у меня может быть только одна 4. То есть потом придется как-то отсеивать или еще что-то придумывать. А мне нужен алгоритм, чтобы только из существующих элементов сочетания делал.

Добавлено @ 19:52 
То есть еще можно так сформулировать: дан массив элементов, сформировать всевозможные сочетания заданной длины и меньше (макс. длина 15 - все сочетания длигой 1, 2, ..., 15), пример массива из предыдущего примера - [1,1,2,2,3,4] 
PM MAIL   Вверх
SoWa
Дата 13.5.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Вот я и говорю- подставляешь вместо s:=s+chr(i); подстановку из массива.  

Это сообщение отредактировал(а) SoWa - 13.5.2006, 20:25


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Litanika
Дата 13.5.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2006

Репутация: нет
Всего: нет



SoWa, 
если я правильно поняла, то я делаю массив из элементов (будет arr=[1,1,2,2,3,4]), делаю s:=s+a[i], i пробегает от 1 до length(arr)?
если так сделать, то ничего путного не получается, она мне делает 1, 11, 111 {для первой единицы}, 111, 112, 113, 114, {потом для второй начинает} 11, 111, 111, ...
Так что не получается или что-то я не догоняю? 
PM MAIL   Вверх
SoWa
Дата 14.5.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



В общем, этот код даст тебе все перестановки из данного множества. Выбирать повторения придется самой. Это не так сожно. И работу не на много замедлит... Постарайся сама написать выбор повторяющихся элементов и однородных строк типа 222. 


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Litanika
Дата 14.5.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2006

Репутация: нет
Всего: нет



SoWa, ок спасибо за помощь, надеюсь щас все получится у меня 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.