Hogy kell ezt leprogramozni pascal nyelven h a dev pas is lefutasa?
Úgy, hogy megtervezed, milyen részletekből álljon a program, azokat még kisebb részekre bontod, amíg olyan elemi feladatokig nem jutsz, amelyeket már le tudsz kódolni a pascal szabályai szerint. Ha valamelyik részfeladatban elakadsz, itt bemutatod a próbálkozásodat, és megpróbáljuk megkeresni a hibát. Ha már az egész készen van, a teljes kódot is feltöltheted valahová, általában tanulságos, hogy hogyan fésülgetik ki a tapasztaltabbak.
Ha rosszul értettem, és már készen van egy másik pascal-változatban, csak annyi a probléma, hogy a Dev-Pascallal nem tudod lefordítani, akkor megint csak mutasd be a kódot. A Dev-Pascal, tapintatosan szólva, nem éppen naprakész, de bizonyára megtaláljuk a módját, hogy a te modernebb megoldásaidat hozzábutítsuk.
A leírásod alapján én egyelőre egy kukkot sem értek a játék céljából, de a kód majd megvilágítja az értelmét.
Honnan van ez a feladat?
Nekem kicsit információhiányosbak tűnik a kiírás... az nincs benne hogy csak az egyik darabot (amelyik nem kisebb a másiknál) osztják tovább?
Amúgy tipikus versenyfeladat algoritmikus tudás felmérésére. Ez egy kezdő szintű feladat.
Mr Papp (a kérdező) már többször is megkérdezte (privátban), hogy ezt a problémát meg tudnám-e oldani.
Igazán megtisztelő a feltételezése, de a probléma egyáltalán nem olyan egszerű, mint ahogyan itt a válaszadók egyike-másika próbálta felvázolni.
Pár napja már gondolkozom rajta, tehát van egy csokoládétábla (NxM mátrix), amelyből egészen addig lehet törni, amíg van egy legalább 1xK méretű darab.
Tehát a csodoládéból nem csak 1xK méretű darabokat lehet letörni (vagyis nem NIM jellegű, pl. "mérgezett-csokoládé"), hanem már kezdetben is széttörhetem 2 olyan darabra, amelyekből a következő lépéskor szintén le tudok törni 1xK méretű darabokat.
Ezen a ponton megfordult a fejemben a dinamikus-megvalósítás, tehát minden csokoládédarabra létrehozni egy dinamikus-mátrix-ot, amelyre megint el lehet játszani a törést. ...vagyis már ott tartunk, hogy rekurzívan kellene megoldani (vagy mélységi gráffal)
Tehát mi alapján döntjük el, hogy a csokoládé melyik oldalából törünk? (esetleg véletlenül?)
Egyáltalán hogyan döntjük el, hogy egy már igy-úgy tört csodokádédarabot hogyan törünk tovább???
Meg egyáltalán hogyan tároljuk el a csodikarabok alakját?
(fontos ez?)
Lehet, hogy csak én bonyolítom túl a dolgot... :-)
Tehát nem maga a beolvasás és a kiiírás a nehéz. ...ráadásul egy algoritmust akármilyen programozási nyelvre át lehet ültetni.
NIM:
Mérgezett csokoládé:
@#4:
Két dologban szinte bizonyos vagyok:
1. Valószínű, hogy te bonyolítod túl a dolgot. Én úgy értem a feladatot, hogy játékot nem lejátszatni kell a géppel, hanem csak levezetni. Vagyis két emberi játékos játszik egymás ellen, a program pedig a megadott értékekről elindulva pusztán könyveli a tábla méretének változásait, illetve ellenőrzi, hogy az adott törés után maradt darab törhető-e tovább. Ha nem, az utolsó lehetséges törést végrehajtó játékos nyert. A törést a játékosok mindig ugyanúgy végzik (például a tábla egy oszlopának megadásával), szerintem így kap értelmet, hogy a darabok elforgathatók. Ha mindig csak a megmaradt darabbal foglalkozunk (szerintem ez a feladat), nincs szükség a darabok számontartására, csak a két oldal méretéére -- ezek forgatáskor megcserélődnek. A másik lehetőség, hogy az összes letört darabot még tovább kell tördelni, és végül az így kapott részeredményeket összesítve határozható meg a győztes. Itt valóban szerepet kaphatna a rekurzió és a darabok méretének külön-külön való tárolása, de a pongyola leírásban én nem látok erre való utalást. A „nem nagyobb” vizsgálat inkább arra mutat, hogy csak az egyik darab érdekes a továbbiakban, a másik kikerül a játékból.
2. A scriba-feltételnek tényleg benne kéne lennie a programban. Anélkül ugyanis egyrészt bonyodalmasabb a bekérés (külön tisztázni kell, hogy melyik darab maradjon meg), másrészt -- ami lényegesebb -- már az első lépésekben a minimális méretű darab mellé töréssel lehetne kényszerítőzni, a tábla méretétől gyakorlatilag függetlenül, ez kevesebb stratégiát enged meg.
Kérdező meg a privát levelezés helyett inkább itt mutathatná be a kísérleteit. Ha megelégszünk az én feltételezésemmel, a program nem túlságosan bonyolult, és jól szétbontható külön-külön is megoldható eljárásokra/függvényekre.
#5-ösnek (tabaki)
A te elgondolásod is csak feltételezés, köszönhetően annak, hogy a játékleírás hiányosnak tűnik.
De legyen igazad és tényleg "csak" levezetni kell a játékot, nézzük mi van ebben az esetben.
1.: a játékosoktól be kell kérni, hogy melyik csokidarabból akar törni,
2.: meg azt is, hogy mekkora darabot akar letörni,
3.: esetleg honnan.
Ez így akkor egy könnyű játék?
(a sok feltételezésből végül tényleg összehozunk egy játékot, ha így haladunk)
Az én változatom szabályai a következők:
1. A játék egy megállapodás szerinti oszlop- és sorszámú táblával indul.
2. Ezen kívül meg kell határozni egy tetszés szerinti hosszúságú, 1 kocka szélességű szeletet, amelynél a tábla nem törhető kisebb méretűre. A szelet értelemszerűen nem lehet hosszabb a tábla nagyobb méreténél.
3. A játékot két játékos játssza egymás ellen, oly módon, hogy felváltva a táblát felváltva tetszés kétfelé törik, míg el nem érik az előzőleg meghatározott legkisebb méretet. A játékos célja, hogy az utolsó lehetséges törést ő hajtsa végre, és az ellenfélnek maradjon a tovább már nem törhető darab.
4. A törést a tábla tetszés szerinti oszlopának számával lehet megadni, és a tábla a teljes magasságában elhasad. Ha a játékos a másik méretből akar törni, akkor előbb elfordítja a táblát. Ilyenkor a vezérlés nem kerül vissza a másik játékoshoz, így a törést -- megint csak az oszlopszám megadásával -- végre tudja hajtani.
5. törés után csak a nagyobb darab marad a játékban, a leesővel a program nem foglalkozik. A darabok sorrendje közömbös, tehát mindegy, melyik oldalról törünk ugyanannyi oszlopot. Ennek megfelelően a középen eltört tábla esetén sincs szerepe annak, hogy a maradék fél táblát a jobb- vagy a baloldali félnek tekintjük.
6. A tábla csak akkor osztható a minimumhossznál kisebbre, ha a másik irányban megvan ez a méret.
Illusztrációk -- nem megfontolt játék, csak néhány lépés. Nem teszteltem, hogy valójában mennyi lehetőség van a taktikázásra. Az átláthatóság kedvéért csak kis táblát rajzoltam, de ez elméletileg lehet akármekkora, nem követelmény, hogy a program meg is jelenítse.
Egy kiindulóhelyzet, 12 X 9 kocka méretű tábla:
A tovább nem törhető darab 1 X 4 kocka:
Az első játékos eltöri a táblát a fehér vonallal jelzett 5. oszlopnál. A kék vonal az ezzel ekvivalens 7. oszlopot mutatja.
A nagyobb darab mindkét esetben 7 X 9 kocka méretű lesz, tehát ez marad a táblából (a pirossal kiemelt kockák jelzik, hogy a törés problémátlan volt, a minimum mindkét irányban kényelmesen benne van a darabban):
A második játékos közvetlenül a minimumhossznál töri el a táblát:
Az első játékos úgy dönt, hogy még tovább osztja. Ezt megteheti, mert függőlegesen még elfér a minimumszelet:
A második elforgatja a táblát...
...utána eltöri:
A darabból az első már nem tud úgy törni, hogy a másik oldalon ne maradjon meg a győzelmet jelentő sor, lemondóan letöri az utolsó oszlopot:
A második játékos elforgatás után kettéosztja a táblát, ezzel megnyerte a menetet, mert az elsőnek már nincs lehetősége további törésre:
Egyébként meg igazad van, az egész merő ábrándozás. Minél többet nézem a hiányos leírást és a bornírt input-output példát, annál inkább el tudom képzelni, hogy valami primitívebb dologról van szó, nagyon egyszerű stratégiával, aminek az alapján a bevitt adatokból játék nélkül is meghatározható a győztes, és voltaképpen ezt az algoritmust kéne megtalálni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!