Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прошу помочь с задачей

10K
20 сентября 2006 года
ost-andrew
19 / / 24.01.2006
Дан массив, в который последовательно ввели пять целых чисел. Вывести на экран все их возможные последовательности. То есть, если к примеру введены числа 1 2 3 4 5, то последовательности могут быть следующими: 1 2 4 5 3; 3 4 5 2 1 и так далее. Всего последовательностей я насчитал 120 - если не ошибаюсь. Как реализовать?
12K
20 сентября 2006 года
Apelsin
21 / / 06.07.2006
в свое время подобную задачу сделал так. Обрати внимание цикл используется 1 раз(это было необходимое условие). простейший вариант это цикл в цикле по перебору

Код:
uses crt;

const n=10;

type
    TItem = record
        value: integer;
        num: integer;
    end;

    TStekMas = array [1..n] of TItem;
    TMassiv = array [1..n] of integer;

    TStek = record
        massiv: TStekMas;
        top: integer;
    end;

procedure push(var stk: TStek; var  element: TItem; l: integer);
    begin
        if stk.top<l then
            begin
                stk.top:=stk.top+1;
                stk.massiv[stk.top]:=element;
            end;
    end;

procedure  pop(var stk: TStek; var j: TItem);
    begin
        j:=stk.massiv[stk.top];
        stk.top:= stk.top-1;
    end;

procedure renum(var element: TItem; massiv: TMassiv);
    begin
        element.value:=massiv[element.num];
    end;

procedure writestek(stk: TStek; l: integer);
    var
        j: integer;
    begin
        for j:=1 to l do write(stk.massiv[j].value);
        writeln('');
    end;

function summa(massiv: TMassiv; b: integer):integer;
    var x,i: integer;
    begin
        x:=0;
        for i:=1 to (b) do
            begin
                x:=x+massiv;
            end;
        summa:=x;
    end;
var
    flag: boolean;
    i, number, lenght: integer;
    stek: TStek;
    mas: TMassiv;
    x: TItem;

begin
    clrscr;
    {zapolnim massiv}
    write('vvedite chislo: ');
    readln(number);
    lenght:=trunc(ln(number)/ln(10))+1;
    for i:=1 to lenght do
            begin
                 mas:= (number mod trunc(exp(i*ln(10)))) div trunc(exp((i-1)*ln(10)));
            end;
    {start!}
    writeln('variantu vuborok');
    repeat
        if stek.top = lenght then writestek(stek, lenght);
        if flag or (stek.top=lenght) then
            begin
                flag:=false;
                pop(stek,x);
                if x.num<lenght then
                    begin
                        x.num:=x.num+1;
                        renum(x,mas);
                        push(stek,x, lenght);
                    end
                else flag:=true;
                        end;
        if not flag and (stek.top<lenght) then
            begin
                x.num:=1;
                renum(x,mas);
                push(stek,x,lenght);
            end;
    until flag and (stek.top = 0);
end.
242
21 сентября 2006 года
Оlga
2.2K / / 04.02.2006
Полезные ссылки
в 1-ом посте есть ссылка на описание алгоритма Дейкстры для получения всех перестановок. если запутаешься в алгоритме можешь здесь задать вопрос. алгоритм рабочий.
1.6K
29 сентября 2006 года
Shtirlitz
145 / / 31.07.2006
Еще одно, на мой взгляд более компактное решение задачи!
Код:
Program chisla;
const
m={максимальное количество чисел};
type
massive=array[1..m] of byte;
tf=array[1..m] of boolean;
var
mas,chisla: massive;
used: tf;
n,i: byte;
procedure p(i: byte; var mas: massive; var used: tf; const chisla: massive; const n: byte);
label
exit;
var
j: byte;
begin
If i=n+1 then begin
for j:=1 to n do
write('  ',mas[j]);
writeln;
Goto exit;
end;
for j:=1 to n do
If not(used[j]) then begin
mas:=chisla[j];
used[j]:=true;
p(i+1,mas,chisla,used,n);
used[j]:=false;
end;
exit:
end;
begin
writeln(' Vvedite kol-vo chisel ');
read(n);
writeln(' Vvedite Chisla ');
for i:=1 to n do
readln(chisla);
for i:=1 to m do
used:=false;
a:=1;
p(a,mas,chisla,used,n);
write(' Press any key to continue... ');
repeat until keypressed;
writeln;
end.

В целом логика проверена мной! Все работает! В деталях могут быть ошибки! Набирал вручную! Если будут вопросы пишите на [email]artysokolov@yandex.ru[/email]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог