Изменения

Перейти к: навигация, поиск

Коды Грея для перестановок

689 байт добавлено, 04:36, 27 декабря 2011
Нет описания правки
== Псевдокод получения следующего кода Грея ==
Пусть нам известен код Грея для длины $n - 1$, записанный в массив permиз строк $s[i]$, где $i$ - номер перестановки (номерация начинается с единицы).При этом переменная $t = true$, $j = 1$,а $k$ является новым элементом:
procedure grey_code(t := trueboolean; {булевская переменная отвечающая за порядок перебора true: от начала к концу false: от конца к началу} for i j:= 1 to (n - 1integer)! do {перебираем все перестановки из предыдущего кода Грея}; beginvar insert(perm[i], t)str: string; {в зависимости от t вставляем элемент либо в начало, либо в конец перестановки} writeln(perm[i]): integer; begin {выводим первую перестановку} for if j :<= 1 to (n - 1 do)! then {условие выхода из рекурсии}
begin
swapif t = true then begin str := k + ' ' + s[j]; {записываем элемент n в начало строки} writeln(str); for i := 0 to (permn div 2) - 1 do begin c := str[2 * i+ 1]; {меняем элементы местами и выводим каждую новую перестановку} str[2 * i + 1] := str[2 * i + 3]; str[2 * i + 3] := c; writeln(str); end; grey_code(not t, tj + 1); {повторяем процедуру} end else begin str := s[j] + ' ' + k; {записываем элемент n в зависимости от t двигаем элемент влево или вправоконец строки} writeln(permstr); for i := (n div 2) - 1 downto 0 do begin c := str[2 * i+ 1]); {меняем элементы местами и выводим полученные перестановкикаждую новую перестановку} str[2 * i + 1] := str[2 * i + 3]; str[2 * i + 3] := c; writeln(str); end; grey_code(not t, j + 1); {повторяем процедуру}
end;
end;
Анонимный участник

Навигация