Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перестановки / 9 сообщений из 9, страница 1 из 1
23.01.2010, 19:31:06
    #36426861
Obsess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
Есть следующий алгоритм:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
program PerestanovkiRecursion;
	  type Pere=array [byte] of integer;
	  var N,i,j:integer;
	      X:Pere;
	  procedure Generate(k:integer);
	    var i,j:byte;
	    procedure Swap(var a,b:integer);
	      var c:integer;
	    begin c:=a;a:=b;b:=c end;
	  begin
	    if k=N then
	      begin for i:= 1  to N do write(X[i]);writeln end
	    else
	      for j:=k+ 1  to N do
		begin
{      writeln('X[k+1] = ',X[k+ 1 ],' k+1=',k+ 1 );
      writeln('X[j] = ',X[j],' j=',j);
      readln;
 }
 	  Swap(X[k+ 1 ],X[j]);
	   Generate(k+ 1 );
		  Swap(X[k+ 1 ],X[j])
		end
	  end;
	begin
	  write('N=');readln(N);
    X[ 1 ]:= 1 ;X[ 2 ]:= 0 ; X[ 3 ]:= 0 ;x[ 4 ]:= 0 ;
	  { for i:= 1  to N do X[i]:=i;}
	  Generate( 0 );
    readln;
	end.
Работает так. Вводим два числа: 1, 2.
Перестановки выглядят так: 12, 21.
Объясните как сделать так: если вводятся одинаковые числа - по ним перестановки не будет, т.е. вводим: 1, 1.
На выходе только :11.
...
Рейтинг: 0 / 0
23.01.2010, 21:51:25
    #36426973
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
отсортировать и пропустить через uniq
...
Рейтинг: 0 / 0
23.01.2010, 22:11:14
    #36426997
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
tchingizотсортировать и пропустить через uniq
Ну да, только не перестановки сами, а массив исходных значений X.
...
Рейтинг: 0 / 0
23.01.2010, 23:13:03
    #36427049
Obsess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
Vowktchingizотсортировать и пропустить через uniq
Ну да, только не перестановки сами, а массив исходных значений X.
Это задание нужно сделать на Pascal.
Для С++ функция unique() удаляет все последовательные дубликаты из списка.
Т.е. 1223 должен принять вид 123.
Ну тогда на выходе получится 6 различных значений.
Тогда как при 1223 получается 18!
...
Рейтинг: 0 / 0
23.01.2010, 23:17:41
    #36427052
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
пусть есть 1штрих и 1дваштриха.
на выходе получаем список из 2х перестановок
1штрих, 1дваштриха
1дваштриха, 1штрих

поскольку для внешнего наблюдателя и uniq 1штрих не отличим от 1дваштриха
он оставит одну из перестановок
...
Рейтинг: 0 / 0
23.01.2010, 23:47:40
    #36427075
Obsess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
tchingizпусть есть 1штрих и 1дваштриха.
на выходе получаем список из 2х перестановок
1штрих, 1дваштриха
1дваштриха, 1штрих

поскольку для внешнего наблюдателя и uniq 1штрих не отличим от 1дваштриха
он оставит одну из перестановок
Как я понял:
Перестановка 1,2,2 будет выполнена полностью, т.е. все 6 значений, но
uniq оставит только: 122, 212, 221.
Но это очень плохо. Ведь перестановка для 10-значного числа, содержащего 2 разные цифры, должна выполниться 10 раз. Например, 000000001.......1000000000.
А при предложенном варианте на экран выводится 10 различных значений, но перестановка будет выполняться все 10!(факториал) раз.
...
Рейтинг: 0 / 0
24.01.2010, 00:34:03
    #36427104
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
Obsess
Но это очень плохо.

это не хорошо и не плохо, это выполнение требований тз.
автор
Объясните как сделать так: если вводятся одинаковые числа - по ним перестановки не будет, т.е. вводим: 1, 1.
На выходе только :11.
в вопросе требований к эффективности не было.

след вариант см Vowk
удалить дубликаты во входной последовательности цифр -
и в каждой выходной перестановке восстановить дубликаты.
...
Рейтинг: 0 / 0
24.01.2010, 16:12:22
    #36427532
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
Obsess
Работает так. Вводим два числа: 1, 2.
Перестановки выглядят так: 12, 21.
Объясните как сделать так: если вводятся одинаковые числа - по ним перестановки не будет, т.е. вводим: 1, 1.
На выходе только :11.
Уточни задание у преподавателя. Перестановки имеет смысл делать для УНИКАЛЬНЫХ элементов множества. Если мы имеем МУЛЬТИМНОЖЕСТВО то надо дать смысл повторениям 11, 11 в множестве {1,1}.
...
Рейтинг: 0 / 0
25.01.2010, 11:44:37
    #36428511
Crazzy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перестановки
Автор, то, что тебе нужно это не перестановки, а сочетания
тынц
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перестановки / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]