Текущий архив: 2003.01.20;
Скачать: CL | DM;
Вниз
Простая математическая задача Найти похожие ветки
← →
mixvictor (2003-01-07 17:57) [0]Необходимо найти все перестановки заданного вектора.
Например дан вектор (1,2,3,4). Перестановки: (1,2,3,4); (2,3,4,1); (1,2,4,3) и тд. Всего 24 штуки. Необходимо сделать для вектора любо длины. Знаю что количество перестановок считается по формуле N!, где N - число чисел в векторе.
← →
ghg (2003-01-07 18:01) [1]А вопрос то в чем? Что-то я недопонял.
С наилучшими ...
← →
mixvictor (2003-01-07 18:07) [2]Необходимо программно найти все перестановки данного вектора.
← →
}{enon © (2003-01-07 18:23) [3]Не знаю причём тут вектор, но все задачи вида "найти все перестановки" чераются бэктрэкингом (переборм с возвратом).
← →
mixvictor (2003-01-07 18:34) [4]Нельзя ли кодик пожалуйста!!!
← →
Big_Rom © (2003-01-07 18:46) [5]а еще есть такой предмет линейная алгебра и еще один аналитическая геометрия там @ зарыта.
← →
}{enon © (2003-01-07 19:00) [6]
procedure main;
const n=4;
var
i: integer; "счётчик
v: array[1..n] of integer; "твой вектор
st: array[1..n] of integer; "стек
l: integer; "длина стека
begin
for i:=1 to n do n[i]:=i;
l:=0;
perebor(v, n);
end;
procedure perebor(cv: array of integer, cl: integer;);
var
j: integer;
ccv: array of integer;
begin
for i:=0 to cl-1 do
begin
l:=l+1;
st[l]:=cv[i];
if l=n then Делай со st то, что нужно; l:=0; else
begin
setlenght(ccv,cl-1); "Не помню, как пользоваться setlenght
for j:=0 to cl-1 do
begin
if j<i then ccv[j]:=cv[j];
if j>i then ccv[j]:=cv[j-1];
end;
perebor(ccv,cl-1);
l:=l-1;
end;
end;
end;
Вроде бы всё, иначе - пиши. А вообще, олимпиадами нужно интересоваться - стандартные олимпиадные алгоритмы часто бывают полезными.
← →
Sha © (2003-01-08 17:52) [7]Простое математическое решение:
procedure NextPermutation(const s: string);
var
c1, c2, c3, c4: char;
i, j, k: integer;
p: pchar;
f: boolean;
begin;
i:=length(s); if i<=1 then exit;
j:=i; p:=pointer(s); c1:=(p+i-1)^;
repeat;
dec(i); c2:=c1; c1:=(p+i-1)^;
if c1<c2 then begin;
k:=i+1; f:=true;
while k<=j do begin;
c4:=(p+j-1)^;
if f and (c4>c1) then begin; (p+i-1)^:=c4; c4:=c1; f:=false; end;
(p+k-1)^:=c4;
if k=j then break;
c3:=c2; c2:=(p+k)^;
if f and (c2<c1) then begin; (p+i-1)^:=c3; c3:=c1; f:=false; end;
(p+j-1)^:=c3;
inc(k); dec(j);
end;
break;
end;
until i<=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
len= 6;
var
s, t: string;
i: integer;
p: pchar;
begin;
SetLength(s,len); p:=pchar(s); for i:=1 to len do (p+i-1)^:=chr(ord("0")+i);
SetLength(t,len); p:=pchar(t); for i:=1 to len do (p+len-i)^:=chr(ord("0")+i);
Memo1.Lines.BeginUpdate;
Memo1.Lines.Clear;
Memo1.Lines.Add(s); i:=1;
while s<>t do begin;
NextPerMutation(s); Memo1.Lines.Add(s); inc(i);
end;
Memo1.Lines.EndUpdate;
Label1.Caption:=IntToStr(i);
end;
Страницы: 1 вся ветка
Текущий архив: 2003.01.20;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.022 c