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
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
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
↑ 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
Napriklad takhle (je to jen cast programu) :
... 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
↑ 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
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
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
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
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
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
↑ 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
↑ 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