Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 27. 11. 2010 21:33

Majki
Příspěvky: 120
Reputace:   
 

následná permutace

Zdravím,
do programování mám udělat program, který hledá následující permutaci v lexikografickém uspořádání.


zadání: Na vstupu je číslo které není větší než 100, pak permutace přirozených čísel oddělených mezerami od jedné do n,celý vstup na jednom řádku.
Program k zadané permutaci určí permutaci bezprostředně po ní následující v lexikografickém uspořádání, která bude na výstupu na jednom řádku, čísla opět oddělená mezerami.

Pozn. pokud je permutace v lexikografickém uspořádání poslední vypsat "neexistuje".



Při zkoumání permutací jsem došel k algoritmu
1) zjistit kdy je poprvé číslo v permutaci nižší než to před ním
2) opsat vše co je před číslem z bodu 1)
3) za tato čísla napsat číslo nejbližší vyšší než je číslo z bodu 1) (tedy číslo vyšší než z bodu 1) které ještě není použité)
4) po číslu z bodu 3) následují ostatní čísla v rostoucím pořadí

doufám, že je tento algoritmus srozumitelný

nějak nemohu přijít na to, jak napsat program

děkuji všem za ochotu a nápady
majki

Offline

  • (téma jako vyřešené označil(a) Majki)

#2 28. 11. 2010 13:32

vojta01
Příspěvky: 63
Reputace:   
 

Re: následná permutace

Ahoj, tako úloha se tu nedávno řešila: http://forum.matweb.cz/viewtopic.php?id=8358
Já neznám učivo následucích permutací, takže ti nemůžu pomoci.

Offline

 

#3 28. 11. 2010 23:44

Majki
Příspěvky: 120
Reputace:   
 

Re: následná permutace

↑ vojta01:
jo ale to jak to napsat do pascalu tam nevidim
a v c++ vzhledem k tomu ze s programovanim zacinam se nevyznam
nevedel by nekdo jak na to?
diky

Offline

 

#4 29. 11. 2010 17:40

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: následná permutace

Napriklad takhle (je to jen cast programu) :

Code:

 ...
  for i := Delka - 1 downto 0 do begin      {Najit posledni, co je mensi nez nasledujici}
    if i = 0 then break;
    if Permutace[i] < Permutace[i+1] then break;
  end;

  if i >= 1 then begin           
    Nejmensi := Delka + 1;                  {Najit nejmensi vetsi}
    IndexNejmensi := 0;
    for j := i + 1 to Delka do
      if Permutace[j] > Permutace[i] then
        if Permutace[j] < Nejmensi then begin
          Nejmensi := Permutace[j];
          IndexNejmensi := j;
        end;

    Temp := Permutace[i];                   {Vymenit prvni menenou za nejmensi vetsi}
    Permutace[i] := Permutace[IndexNejmensi];
    Permutace[IndexNejmensi] := Temp;

                                            {Setridit konec}
 ...

Snazil jsem se napsat to prehledne, ale moc mi to nejde. Jestli se tam nekomu neco nezda, at me klidne opravi :-)

Jestli neco neni jasne, tak se ptej.

Offline

 

#5 30. 11. 2010 14:09 — Editoval Honzc (30. 11. 2010 14:13)

Honzc
Příspěvky: 4549
Reputace:   241 
 

Re: následná permutace

↑ Majki:
Následující funkce má výstup následnou permutaci, nebo hlášku, že neexistuje.
Předpokladem je, že máš v poli načtena čísla  (permutaci) ze vstupu. Indexováni pole je od indexu 0. Proměnná  delka je to první číslo ze vstupu.

type Tpole=array of Integer;
var delka: Integer;
      st: String;

function NextPerm(a: TPole):String;
var i,j,n,r,s: Integer;
procedure Vymen(var x,y: Integer);
var pom: Integer;
begin
  pom := x;
  x := y;
  y := pom;
end;
begin
  n :=delka;
  i := n-2;
  while (a[i]>a[i+1])and(i>=0) do
    i := i-1;
  if i<0 then
    Result := ' Neexistuje'
  else
  begin
    j := n-1;
    while (a[i]>a[j]) do
      j := j-1;
    Vymen(a[i],a[j]);
    r := n-1; s := i+1;
    while r>s do
    begin
      Vymen(a[r],a[s]);
      r := r-1; s := s+1;
    end;
    for i := 0 to n-1 do
      Result := Result+' '+Str(a[i],st);
  end;
end;

Offline

 

#6 30. 11. 2010 19:13 — Editoval Majki (30. 11. 2010 19:14)

Majki
Příspěvky: 120
Reputace:   
 

Re: následná permutace

nabizim to kam az sem se dostal
mam ale problem s vyhodnocenim v codexu

Jailing user 'codex' (UID 1003, GID 1003) into directory '/home/codex/workers/eval2/jail'
Initializing... OK
Preparing sandbox... running locally (INSECURE), OK
Finding source... ./inbox/source.pas
Compiling... OK
Test 1... <init> <run> RE:Runtime error 201: Range check error
Test 2... <init> <run> <filter> <check> OK:OK (170 points)
Test 3... <init> <run> <filter> <check> OK:OK (170 points)
Test 4... <init> <run> <filter> <check> OK:OK (170 points)
Test 5... <init> <run> <filter> <check> OK:OK (170 points)
Test 6... <init> <run> <filter> <check> OK:OK (150 points)

kdyz sem zmenil rozsah pole z 1..100 na 1..300 chyba zustava
dekuji za pomoc s hledanim pricin

zdrojak

Offline

 

#7 30. 11. 2010 21:41

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: následná permutace

Jak mas ten cyklus:

while p[i] > p[i + 1] do

tak tady kdyz zadas treba permutaci  5 4 3 2 1, tak to spadne, protoze 'i' dojde az na nulu.

Tak kdyz to upravis treba takhle:

while  (i >= 1) and (p[i] > p[i + 1]) do
      dec(i);
      if i = 0 then
        write('NEEXISTUJE')
      else

tak to bude fungovat (ale jeste je treba posunout to predposledni 'end'  - aby kdyz ta permutace neexistuje, tak aby se uz nevypisovala). Snad tohle pomuze.

Offline

 

#8 30. 11. 2010 22:32 — Editoval Majki (30. 11. 2010 22:35)

Majki
Příspěvky: 120
Reputace:   
 

Re: následná permutace

myslis to takhle?

program nasledna_permutace;
var  c, k,l, i:integer; p:array [1..100] of integer;

begin
read(c);
for i:=1 to c do
    begin
    read(p[i]);
    end;
i:=c - 1;
while (p[i] > p[i + 1]) and (i>=1) do     
      dec(i);
      if i = 0 then                       
         write('NEEXISTUJE');                             
        else
        begin
        k:=c;
        while p[k] < p[i] do   
          begin
          dec(k);
          end;
        l:=p[i];                         
        p[i]:=p[k];
        p[k]:=l;
        inc(i);   
        k:=c;
          while i < k do                           
                begin
                l:=p[i];
                p[i]:=p[k];
                p[k]:=l;
                dec(k);
                inc(i);
                end;
           
         end;


        for i:=1 to c do         
                write(p[i],' ')
end.

Offline

 

#9 30. 11. 2010 22:57 — Editoval Lumikodlak (30. 11. 2010 23:40)

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: následná permutace

Temer :-) ,myslel jsem spis tohle:


program nasledna_permutace;
var  c, k,l, i:integer; p:array [1..100] of integer;

begin
read(c);
for i:=1 to c do
    begin
    read(p[i]);
    end;
i:=c - 1;
while (i>=1) and (p[i] > p[i + 1]) do     
      dec(i);
      if i = 0 then                       
         write('NEEXISTUJE')                             
        else
        begin
        k:=c;
        while p[k] < p[i] do   
          begin
          dec(k);
          end;
        l:=p[i];                         
        p[i]:=p[k];
        p[k]:=l;
        inc(i);   
        k:=c;
          while i < k do                           
                begin
                l:=p[i];
                p[i]:=p[k];
                p[k]:=l;
                dec(k);
                inc(i);
                end;
           
        for i:=1 to c do         
                write(p[i],' ')
         end;
end.

To (i>=1) musi byt prvni, aby kdyz 'i' je nula, tak aby tenhle test neprosel a uz to netestovalo tu druhou podminku (p[i] > p[i + 1]). A pak jeste ten "end;" skoro na konci presunout za "for i:=1 to c do write(p[i],' ')". Ale ten kod, co jsem tu ted napsal, jsem netestoval, snad to bude ok.

Offline

 

#10 30. 11. 2010 23:06

petrkovar
Veterán
Místo: Ostrava/Krmelín
Příspěvky: 1012
Pozice: VŠB - TU Ostrava
Reputace:   23 
Web
 

Re: následná permutace

Návrh na alternativní postup:
Ve skriptech na straně 39/40 je mazaný algoritmus pro generování variací bez opakovaní. Pro n=k se jedná o permutace. Možná by stačilo využít běh řídícího cyklu mezi dvěma zpracováními sestavované variace (první řádek strana 40).

Offline

 

#11 30. 11. 2010 23:09

Majki
Příspěvky: 120
Reputace:   
 

Re: následná permutace

↑ Lumikodlak:
tak moc ok to nevypada prave pro to 5 4 3 2 1

Offline

 

#12 30. 11. 2010 23:40

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: následná permutace

↑ Majki:
To je divne, ted jsem to zkousel, a funguje to (napise NEEXISTUJE), akorat je treba jeste ubrat strednik za "write('NEEXISTUJE')", tak to zEdituju jeste. Zadaval jsi tam na zacatku pocet prvku v te permutaci, cili 5 5 4 3 2 1? nebo jenom 5 4 3 2 1?

Offline

 

#13 30. 11. 2010 23:44 — Editoval Majki (30. 11. 2010 23:44)

Majki
Příspěvky: 120
Reputace:   
 

Re: následná permutace

↑ Lumikodlak:

nalezena chyba v programu
prvni test psal error kvuli tomu ze kdyz to zada pouze jednoprvkovou permutaci tak to napise error
zrejme kvuli tomu ze se pouziva index a index+1

takze je to potreba osetrit zvlast if podminkou

ted uz jedou vsechny korektne.

povazuji to za vyresene.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson