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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2013, 17:22   #1
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию Составить комбинацию цифр из массива

Доброго времени суток.
Просто подскажите в каком направлении мыслить.
Вводим в массив 4 или более цифр. Составить все комбинации этих цифр. Для 4 это 4!=24 комбинации.
Уже не один раз(по разному) в ручную решил этот пример для 4 цифр, никак не могу уцепить логику для решения на Делфи. Без вспомогательных массивов.
Решать на 5 цифр не хватило духу.
Artsiom вне форума Ответить с цитированием
Старый 02.12.2013, 17:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Рекурсия наше все. На форуме и примеры есть, только найти. Кстати совсем не 4!. Некоторые цифры в массиве могут повторяться, тогда комбинаций меньше будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.12.2013, 05:47   #3
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Неа, нужно составить без повторений комбинаций.
И к сожалению на форуме так много информации и всё не по моей теме. Ключевые слова рекурсия и комбинаторика выдают слишком много постов, уже глаза болят.
Может всё же на мысль натолкнёте?
Artsiom вне форума Ответить с цитированием
Старый 04.12.2013, 07:38   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Формула для повторяющихся :
N! / (n1!*n2!*n3!*...*nk!)
Где N - общее кол-во
А n1+n2+n3+...+nk = N

Теперь о решении..
тыц

Еще, господин Меньшиков в своей книге "Олимпиадные задачи по программированию".. приводит 3 варианта.. (там задача называется перестановки 2)
Один генерируется лексикографически, без доп. массивов
А другие 2 требует доп.. (пишу по памяти => могу ошибаться)..
Poma][a вне форума Ответить с цитированием
Старый 05.12.2013, 03:50   #5
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Значит я ужасно, непроходимо тупой человек. А ещё и не умеющий читать чужой код.
Ладно то с сообщениями на форуме. Книга Меньшикова помогла, я понял, что делать, но не понял как. Написал свой код. Для случая если количество цифр равно 4 и цифры не повторяются(!). Потом изменить под любое кол-во не составит труда. И как по Меньшикову пошел шпарить своего монстра.
Что он должен делать.
1. С начала ввод данных. Лучше всего 1, 2, 3, 4.
2. Заполнить 6 раз каждый 5-й эл-т(начиная от 1-го) единицами выполнять до 6 четверки эл-в. Потом дальше заполнить двойками аналогичным образом до 12. и т.д.
3. Тут попытался объяснить, но очень запутанно получилось. Лучше скрин, там всё видно сразу http://php-studia.ru/?v=img201qqq.jpg
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
 a : array[1..96] of integer;
 i, j, n, k, q, l, qq, g  : integer;


//УЖАС №1
function mass(k1, q1:integer) : boolean;
var
 i1, i2 : integer;
begin
  for i1:=0 to q1-1 do
  for i2 := 1 to 4 do
   begin
     result := false;
   if (a[k1+i1-1]<>a[q1]) then
   if a[k1+i1]<>a[i2] then
    Result:=true;
  end;

end;



begin
 for i:=1 to 4 do
 begin
   write('a[',i,']=');
   readln(a[i]);
 end;

 q:=1; n:=0;
repeat
  k:=1;
 for i:=1 to 6 do
 begin
  a[n+k]:=a[q];
  k:=k+4;
 end;

 n:=n+24;
  q:=q+1;
until n>=120;

//УЖАС №2
//for j:=0 to 23 do
//for g:=1 to 4 do
begin
 q:=1; n:=0;
repeat
  k:=2;
 for i:=1 to 2 do
 begin
 if mass(n+k,q)=true then
  a[n+k]:=a[q];
  k:=k+4;
 end;

 n:=n+24;
until n>=120;
end;




qq:=0;
repeat

writeln( a[qq+1] ,' ', a[qq+2] ,' ', a[qq+3] ,' ', a[qq+4] );

qq:=qq+4;
until qq>=96 ;

readln;

end.
Может кто ни будь поможет с вопросом?
Почему когда я раскомментирую строку for g:=1 to 4 do в части ужас №2 и присвою q:=g;
Код:
for g:=1 to 4 do
begin
 q:=g; n:=0;
То у меня не выполняется условие в части ужас №1
Код:
   if (a[k1+i1-1]<>a[q1]) then
  if a[k1+i1]<>a[i2] then
Получается оно должно проверять есть ли такая цифра в предыдущем элементе массива и есть ли такая цифра из заданных(просто весь массив по умолчанию заполнен 0, от этого и отталкиваюсь) с начала в элементе которому я хочу присвоить что либо.
Оно выдает какую то чушь в конце. Не ругайте, лучше помогите.

Последний раз редактировалось Artsiom; 05.12.2013 в 04:05.
Artsiom вне форума Ответить с цитированием
Старый 05.12.2013, 07:05   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ааа..
Всё ясно.. Это мы с Аватаром намудрили..

Предлагаю Вам вот такой вот код
Код:
var
	s : string;
procedure Swap (var a, b : Char);
var
	temp : Char;
begin
	temp := a;
	a := b;
	b := temp
end;

procedure Permute (k : Integer);
var
	i : Integer;
begin
	if k = Length(s) then begin
		WriteLn (s);
		Exit
	end;
	
	for i := k to Length(s) do begin
		Swap(s[i], s[k]);
		Permute (k+1);
		Swap(s[i], s[k])
	end		
end;


begin
	ReadLn (s);
	Permute (1)
end.
Он не генерирует лексикографическую последовательность.. Зато понятен.. и легок в написании..
А суть чрезвычайно просто..
Вы берете 1-ый элемент, и ставите на его место все остальные. Затем берете 2-ой элемент, и снова ставите на его место оставшиеся..
Poma][a вне форума Ответить с цитированием
Старый 05.12.2013, 23:19   #7
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Ооо! Спасибо большое. Конечно всё же интересно, что я упустил из виду в своем недорешении, но всё равно спасибо.
Artsiom вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить два массива с различными простыми числами среди элементов исходного массива и их частотами maksimum Помощь студентам 7 09.04.2012 17:05
Надо составить программу которая отображает произношении цифр Алиш Паскаль, Turbo Pascal, PascalABC.NET 3 27.01.2011 08:29
Pascal: Составить программу генерирования массива B, состящего из отрицательных элементов массива a mrRastom Помощь студентам 2 15.01.2011 14:33
Хук на комбинацию W0LF Win Api 9 26.07.2009 10:33
Подсчет значащих цифр массива RomT24 Паскаль, Turbo Pascal, PascalABC.NET 5 27.04.2009 17:32