Marťané a pozemšťani se snaží dostat přes kanál na Marsu.

Vaše hodnoty:






= 0) ? (int)$_GET['cp'] : 2 : 2; // počet pozemšťanů $cm = isset($_GET['cm']) ? ((int)$_GET['cm'] >= 0) ? (int)$_GET['cm'] : 2 : 2; // počet marťanů $mp = isset($_GET['mp']) ? ((int)$_GET['mp'] > 0) ? (int)$_GET['mp'] : 50 : 50; // hmotnost pozemšťanů $mm = isset($_GET['mm']) ? ((int)$_GET['mm'] > 0) ? (int)$_GET['mm'] : 25 : 25; // hmotnost marťanů $k = isset($_GET['k']) ? ((int)$_GET['k'] >= 0) ? (int)$_GET['k'] : 0 : 50; // kapacita lodi echo "

Vstupní data:

"; echo "

Počet pozemšťanů = $cp, marťanů = $cm.
Hmotnost pozemšťanů = $mp, marťanů = $mm.
Kapacita lodi = $k

"; if ($cp == 0) $mp = 0; // nulace hmotnosti při nevýskytu dané bytosti - pro potřeby následující porovnávací podmínky if ($cm == 0) $mm = 0; // Tato případná záměna probíhá z důvodu přehlednosti a obecnosti řešícího algoritmu, který prioritně pracuje s `většími` pasažéry a `menšími` řidiči if ( ($mm > 0) && ($mp >= $mm) || ($mp == 0) ) { $hv = $mp; $pv = $cp; $vtext = "pozemšťan"; // h- ... hmotnost, p- ... počet $hm = $mm; $pm = $cm; $mtext = "marťan"; } // -v ... větší, -m ... menší else { $hv = $mm; $pv = $cm; $vtext = "marťan"; // v případě, že je marťan těžší než pozemšťan, proběhne `prohození` $hm = $mp; $pm = $cp; $mtext = "pozemšťan"; } echo "

Analýza dat:

"; echo "

Hmotnost většího = $hv, počet větších = $pv, rod = $vtext
Hmotnost menšího = $hm, počet menších = $pm, rod = $mtext

"; echo "

Řešení:

"; if ( $k == 0 ) echo "Nelze řešit, nemáme loď!"; elseif ( ($hv > $k) || ($hm > $k) ) echo "Nelze řešit! Hmotnost cestujících nesmí být větší než kapacita lodi."; elseif ( (($pv+$pm) >= 2) && (($hm*2) > $k) ) echo "Nelze řešit! Neexistuje způsob, jak by se loď mohla vrátit nazpět."; elseif ( ($pm == 1) && (($hv+$hm) > $k) ) echo "Nelze řešit! Neexistuje způsob, jak by se loď mohla vrátit nazpět."; else { ?> \n\n\n\n\n\n\n"; while ($bytosti > 0) { $kap = $k; // obnovení kapacity vozidla - vyprázdnění $nm = $nv = 0; // počet malých a velkých, kteří momentálně nastoupili if ($mo == 0) // pokud na druhé straně žádný menší není, tak jeden nastoupí (zajišťuje potřebné minimum pro návrat lodi) { $kap -= $hm; $pm--; $bytosti--; $mo++; $nm++; } while ($kap > 0) // nastupují větší dokud je místo v lodi { if ($pv == 0) break; // pokud už žádný větší není, cyklus se vynuceně ukončí $kap -= $hv; $pv--; $bytosti--; $nv++; } if ($kap < 0) { $kap += $hv; $pv++; $bytosti++; $nv--; } // pokud poslední nastoupivší `větší` přesáhl nosnost lodi, vystoupí while ($kap > 0) // nastupují menší dokud je místo v lodi { if ($pm == 0) break; // pokud už žádný menší není, cyklus se vynuceně ukončí $kap -= $hm; $pm--; $bytosti--; $mo++; $nm++; } if ($kap < 0) { $kap += $hm; $pm++; $bytosti++; $mo--; $nm--; } // pokud poslední nastoupivší `menší` přesáhl nosnost lodi, vystoupí $pocet_cest++; // loď odjede, ale jeden cestující se vrací (řidič) ((pouze pokud je potřeba někoho ještě převézt)) if ($bytosti > 0) { $pm++; $bytosti++; $mo--; $nmv = "1 $mtext"; } //$nmv uchovává text jednotky, která se vrátila nazpět echo "\n\n\n\n\n\n\n"; $nmv = ""; } echo ""; ?>
Krok Nastoupili Vrátil se Zbývá převézt
$pocet_cest$bytosti$pv"."x $vtext
$pm"."x $mtext
$pocet_cest$nv"."x $vtext
$nm"."x $mtext
$nmv$bytosti$pv"."x $vtext
$pm"."x $mtext
Celkový počet kroků: ".$pocet_cest."