ahoj, prosímvás, potřeboval bych poradit, dostali jsme ve škole čtvrdletní práce z deseti programů jsem osm již udělal, ale jsou tu dvě, s kterýma nemůžu hnout, a tak bych vás chtěl požídat o pomoc
1. Prvočísla
Vytvořte program na hledání prvočísel. Zadáté číslo X a úkolem programu je: najít nejmenší prvočíslo, které je větší než zadané číslo X.
2. Bludiště
Napište program, který vytvoří náhodné bludiště a uloží ho do souboru. Na vstupu program dostane rozměry bludiště a minimální délku nejkratší cesty. Program by měl vhodně umísit start, cíl a zdi, aby bludiště mělo řešení a vyhovovalo zadání. Ve výstupním souboru S značí start, C cíl, x značí zeď a 0 volné pole(cestu). Program musí generovat různá bludiště i pro stejné vstupní hodnoty.
Příklad bludiště pro rozměry 5x3 a minimální délkou cesty 6:
S00xx
xx0xC
xx000
za každou pomoc děkuji
Fórum › Pascal
čtvrdletní práce prosím pomoc
ad 1: zkus vygooglit Erastotenovo síto.
ad 2: o generování náhodného bludiště je článek na http://int21h.ic.cz/engine/article.php?id=35 a o hledání nejkratší cesty bludištěm na http://soul-draco.mysteria.cz/blog/algoritmy.htm .
Ten prvy:
uses crt;
var a,x:integer;
jePrvocislo:boolean;
begin
clrscr;
readln(x);
repeat
inc(x);
jePrvocislo:=true;
for a:=2 to x-1 do
if x mod a = 0 then
begin
jePrvocislo:=false;
a:=x-1;
end;
until jePrvocislo;
write(x);
readln;
end.
A ta druha je uz na dlhsie.
Rozhadzes si najskor do pola stringov vsetko ako ma byt a potom rekurziou najdes najkratsiu cestu.
Co přesně není jasné?
Předpokládám, že dvourozměrná pole (např. array[y1..y2,x1..x2] of byte) umíš projít políčko po políčku (for y:=y1 to y2 do for x:=x1 to x2 do begin ...pole[y,x]... end;) a cestou počítat políčka s nějakou hodnotou nebo se dívat do jejich nejbližšího okolí (...pole[x+1,y]... ...pole[x,y-1]... atd.).
Jestli se ti nelíbí slovo fronta v popisu algoritmu na hledání cesty, můžeš ho vynechat a použít pomocné dvojrozměrné pole stejně velké jako bludiště, do kterého budeš ukládat počty "kroků" pro cestu na odpovídající políčko v bludišti (ten kód ber s rezervou, píšu ho z hlavy a netuším, jak moc bude fungovat):
for y:=1 to VyskaBludiste do
for x:=1 to SirkaBludiste do if PomocnePole[y,x]=nevim
then begin
pom1:=bludiste[y,x-1];
pom2:=bludiste[y,x+1];
if (pom1=zed)or((pom2<>zed)and(pom2<pom1)) then pom1:=pom2;
pom2:=bludiste[y-1,x];
if (pom1=zed)or((pom2<>zed)and(pom2<pom1)) then pom1:=pom2;
pom2:=bludiste[y+1,x];
if (pom1=zed)or((pom2<>zed)and(pom2<pom1)) then pom1:=pom2;
pomocnepole[y,x]:=pom1;
end;
Nevim = hodnota, kterou si zvolíš pro označení políček v pomocném poli, která jsi ještě neohodnotil (na začátku všechna kromě těch, které polohou odpovídají zdem v bludišti - tam vlož co největší čísla, a kromě startovního políčka - tam vlož něco malého)
Pom1, Pom2 = pomocné proměnné
Zed = hodnota políčka v bludišti, kterou sis zvolil pro označení zdi
Těmi čachry s Pom1 a Pom2 jsem našel nejmenší platnou hodnotu z okolních čtyř políček.
Je potřeba nějak ošetřit okraje bludiště (abys nekontroloval hodnoty mimo pole), nejlépe tak, že okraj ohraničíš zdí a průchody po jednotlivých souřadnicích z každé strany o políčko zúžíš.
Výše uvedený cyklus necháš běžet tolikrát, dokud neohodnotí všechna políčka (nezbyde žádné s hodnotou Nevim). Pak se postavíš na cílové políčko, přečteš si jeho hodnotu a dál pokračuješ tak, že přejdeš vždy na to ze čtyř sousedních políček, které má hodnotu o 1 menší než to, na kterém zrovna stojíš. Podle souřadnic těchto políček třeba nějak označuj políčka v původním bludišti, to je ta nejkratší cesta. Její délku spočítáš jako počet takto označených políček. Jestli je kratší než minimální zadaná, všechno vynuluj a nech vygenerovat nové bludiště, jednou to snad vyjde. A kdyby ne (už bys to zkoušel mockrát a pořád nic), tak nech program skončit a řekni, že takhle dlouhou cestu do takhle malého bludiště nelze vecpat a úloha nemá řešení (doufám, že jsem pochopil to tvoje zadání).
Už je to lepší?
Dobrá.
Mám jedno políčko v bludišti. Chci na něj zapsat číslo, které je o 1 větší než číslo na políčkách vlevo, vpravo, nahoře a dole od něj. To znamená, že nejdřív musím to nejmenší číslo z těch čtyř políček najít.
Hledání nejmenší hodnoty z nějaké skupiny čísel se dělá tak, že skupinu projdu a v nějaké pomocné proměnné (zde Pom1) uchovávám nejmenší hodnotu, na jakou jsem zatím narazil. Na začátku do Pom1 prostě vložím hodnotu prvního čísla. Pak ji porovnávám s dalšími čísly a pokud najdu nějaké menší, nahradím jím hodnotu v Pom1.
Proměnnou Pom2 jsem si zavedl jenom proto, abych si zkrátil zápis a nemusel v každém řádku několikrát rozepisovat bludiste[y+...,x+...].
Hodnotu Zed zvol třeba 254 a hodnotu Nevim 255 (pro políčka typu byte), aby byly zaručeně vždy větší než jakákoli možná hodnota v políčku (hodnota v políčku znamená vzdálenost od počátečního políčka). Pak se ti podmínky zjednoduší:
for y:=1 to VyskaBludiste do
for x:=1 to SirkaBludiste do
if PomocnePole[y,x]=nevim
then begin
pom1:=bludiste[y,x-1]; {promenna, do ktere se snazime dostat nejmensi hodnotu z okolnich policek}
pom2:=bludiste[y,x+1];
if pom2<pom1 then pom1:=pom2;
pom2:=bludiste[y-1,x];
if pom2<pom1 then pom1:=pom2;
pom2:=bludiste[y+1,x];
if pom2<pom1 then pom1:=pom2;
pomocnepole[y,x]:=pom1; {nejmensi hodnotu jsme nasli, ted ji do toho pole ulozime}
end;
Tam odkazuji na prvek pole na souřadnicích y,x-1 (tedy vlevo od políčka y,x) a y,x+1 (vpravo od něj). Hodnotu z tohoto políčka ukládám do proměnných Pom1 a Pom2.
BTW, array[1..10,1..20] of byte je to samé jako array[1..10] of array[1..20] of byte. Tedy dvojrozměrné pole = jednorozměrné pole jednorozměrných polí. Ale to celkem není potřeba vědět, 2D pole si prostě představ jako čtvercovou síť o příslušných rozměrech a indexy jako souřadnice na šachovnici (počítají se obvykle od levého horního rohu a rostou dolů a doprava).
Tak přesně tyhle úlohy jsou v domácím kole v letošním okresním kole soutěže v programování v Táboře. Dvě úlohy ze tří.
Moc pěkný... Doufám, že se takhle nesnažíš dosáhnout řešení. Moc ti nevěřím, pole jsou dost základní věc a nemohl jsi bez nich udělat 8 z 10 úloh. A jestli jo, tak by mě zajímalo, jak ty úlohy vypadají.
Tak dobře.
http://mircosoft.webpark.cz/navody.htm -> Základy programování v Pascalu, kapitola Datové typy, podkapitola Pole. Tam jsou pole vysvětlená a nic lepšího ze mě nedostaneš.
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Práce s řetězci. prosím pomoc. — založil to_jsem_ja
Pomoc.... nějaká chybka prosím pomoc - více v podrobném popisu — založil tkstudent
Seminární práce - prosím pomožte: — založil bunjee
Pomoc prosim — založil FrezZzee
Prosim pomoc — založil Honza
Moderátoři diskuze