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
[těžká hádanka] - prelevani vody
Mame nadoby o objemu 10, 7, 7 a 4 litry, v 10-ti litrove nadobe je 10 litru, jedna 7-mi litrova nadoba je prazdna, v druhe 7-mi litrove nadobe je 7 litru, 4 litrova nadoba je prazdna. Jak pomoci prelevani docilime stavu 10, 2, 2, 3 ?
Ja osobne netusim jak neco takoveho resit jinak, nez metodou pokus-omyl, ktera tady selhala, diky za jakoukoli radu nebo reseni.
Offline
Podobné se řešily zde tak třeba pomůže.
Offline
Diky, ale tohle uz jsme procital a v podstate jde o konkretni reseni jinych prikladu, bez postupu nebo zpusobu reseni, takze ja nejsem schopnej nic z toho pouzit na tuhle ulohu. Krome toho jde o 4 nadoby, coz podstatne zvetsuje obtiznost oproti 3 nadobam.
Offline
Já jsem to tedy řešil tou metodou pokus-omyl s tím, že jsem neověřoval, jestli je to nejjednodušší řešení. Tady je (pokud nezáleží na tom v jaké nádobě má být jaký objem):
10 7 7 4 - objemy nádob
10 0 7 0 - počáteční rozdělení
0 6 7 4 - přelití objemu první nádoby nejprve do čtvrté, zbytek do druhé
7 6 0 4 - přelití třetí nádoby do první
7 6 4 0 - přelití čtvrté nádoby do třetí
7 2 4 4 - naplnění čtvrté nádoby obsahem druhé
10 2 5 0 - přelití objemu čtvrté nádoby nejprve do první, zbytek do třetí
6 2 5 4 - naplnění čtvrté nádoby obsahem první
6 2 7 2 - doplnění třetí nádoby obsahem čtvrté
10 2 3 2 - doplnění první nádoby obsahem třetí
Offline
Proto jsem psal, že je to řešení v případě, že nezáleží na tom, v jaké nádobě má být jaký objem. Navíc v zadání není přesně specifikované pořadí nádob. Je tedy nutné, aby dva litry byly v sedmilitrových nádobách a tři litry ve čtyřlitrové?
Offline
↑ warchief:Systematické řešení je (třeba) pomocí tzv. stavového grafu.
Sestavíme všechny přípustné stavy a orientovanou (případně neorientovanou) hranou spojíme ty, mezi kterými existuje přelití podle pravidel.
Ve výsledném grafu hledáme nejkratší orientovanou cestu z výchozího do požadovaného stavu. Pěkně se to programuje.
Poznámka: Existuje i konstrukce řešení pomocí tzv. barycentrických souřadnic, ale to už je nad rámec, neboť pro 5 nádob bychom pracovali v pětirozměrném prostoru a pěkně kreslit se to stejně nedá.
Offline
Strojově nalezené řešení - průchodem do šířky, tedy nejkratší.
Offline
Měl bych tady něco z podobného soudku:)
Máme nádoby o objemu 10, 6, 9, 3 a 10 litru. Ty dvě desetilitrové jsou plné. A musíme docílit aby v nádobách bylo 5, 5, 5, 3 a 2litrů(přesně v tomto pořadí. Minimální počet má být 13 přelití, ale myslím že to není důležité.
Mám podobný problém jako Warchief:(
Offline
To "strojové řešení" znamená, že jsem to naprogramoval - konkrétně v Delphi. Takto vypadal zdroják, asi to není úplně nejelegantnější, ale psal jsem to tehdy zřejmě docela narychlo.
program sudy; {$APPTYPE CONSOLE} uses SysUtils, Classes, Contnrs; type TPole = array[1..4] of Byte; TStav = class H: TPole; Cesta: String; end; const Kap: TPole = (10, 7, 7, 4); var F: TObjectQueue; Pom, Pom2: TStav; Pole: TPole; i, j: Integer; Bylo: array[0..10, 0..7, 0..7, 0..4] of Boolean; begin F := TObjectQueue.Create; Pom := TStav.Create; Bylo[10, 0, 7, 0] := true; Pom.H[1] := 10; Pom.H[3] := 7; F.Push(Pom); while F.AtLeast(1) do begin Pom := F.Pop as TStav; if (Pom.H[1] = 10) and (Pom.H[2] = 2) and (Pom.H[3] = 2) and (Pom.H[4] = 3) then begin WriteLn(Pom.Cesta); Break; end else for i := 1 to 4 do for j := 1 to 4 do if (i <> j) and (Pom.H[i] > 0) and (Pom.H[j] < Kap[j]) then begin Pole := Pom.H; if Pole[i] > (Kap[j] - Pole[j]) then begin Pole[j] := Kap[j]; Pole[i] := Pom.H[i] + Pom.H[j] - Kap[j]; end else begin Pole[j] := Pom.H[i] + Pom.H[j]; Pole[i] := 0; end; if not Bylo[Pole[1], Pole[2], Pole[3], Pole[4]] then begin Bylo[Pole[1], Pole[2], Pole[3], Pole[4]] := true; Pom2 := TStav.Create; Pom2.Cesta := Pom.Cesta + ' ' + IntToStr(i) + IntToStr(j); Pom2.H := Pole; F.Push(Pom2); end; end; Pom.Free; end; ReadLn; end.
Offline
Olin-Díky. Toho jsem se bál(v tom se vůbec nevyznám).
Možná by to šlo na to aplikovat kdybych trochu změnil zadání: Do první 10l nádoby zvládnu těch 5l dostat v pohodě takže bysme ji mohli "vyřadit", protože si myslím že se do dalšího kombinování hodí nejméně. Takže by nám zbylo toto: nádoby o objemu 6,9,3 a 10l ve kterých je 6,9,0 a 0l vody a musíme dostat výsledek 5,5,3 a 2l vody(přesně v tomto pořadí).
Mohl bys to zkusit?
Díky:)
Offline
↑ fofo:
Z 10 0 0 0 10
================
1) 4 6 0 0 10
2) 4 6 9 0 1
3) 1 6 9 3 1
4) 0 6 9 3 2
5) 6 0 9 3 2
6) 6 6 3 3 2
7) 10 2 3 3 2
8) 10 0 5 3 2
9) 10 3 5 0 2
10) 7 3 5 3 2
11) 7 5 5 3 0
12) 5 5 5 3 2
Hotovo
PS Je to tedy na 12 přelévání - ty píšeš, že minimální počet je 13.
Když to kontroliji, pak v mém postupu chybu nikde nevidím.
Offline
↑ fofo:
A co takto:
1 2 3 4 5 z do
Z 10 0 0 0 10
=====================
1) 4 6 0 0 10 1 2
2) 4 6 9 0 1 5 3
3) 4 6 9 1 0 5 4
4) 4 0 9 1 6 2 5
5) 0 4 9 1 6 1 2
6) 0 4 5 1 10 3 5
7) 0 6 5 1 8 5 2
8) 6 0 5 1 2 2 1
9) 6 6 5 0 2 5 2
10) 10 2 5 1 2 2 1
11) 8 2 5 3 2 1 4
12) 8 5 5 0 2 4 2
13) 5 5 5 3 2 1 4
Offline
Když vám to tak hezky jde tak něco složitějšího:)
máme nádoby o objemu 10,6,9,9 a 10l ve kterých je 10,0,0,0 a 10l a máme dostal objemy 8,2,0,2 a 8l (v tomto pořadí)
minimum je 16 přelití(ale netrvám na tom)
tak s chutí do toho;)
Offline
↑ fofo:
Co takhle:
p.c.n 1 2 3 4 5
--------------------------------
objem 10 6 9 9 10
zac z-do 10 0 0 0 10
--------------------------------
1. 1-2 4 6 0 0 10
2. 5-3 4 6 9 0 1
3. 5-4 4 6 9 1 0
4. 2-5 4 0 9 1 6
5. 1-2 0 4 9 1 6
6. 3-2 0 6 7 1 6
7. 2-5 0 2 7 1 10
8. 5-4 0 2 7 9 2
9. 4-1 9 2 7 0 2
10. 2-4 9 0 7 2 2
11. 1-2 3 6 7 2 2
12. 2-3 3 4 9 2 2
13. 3-1 10 4 2 2 2
14. 1-2 8 6 2 2 2
15. 2-5 8 0 2 2 8
16. 3-2 8 2 0 2 8
Offline