Kezdőoldal » Számítástechnika » Programozás » C++-ban lenne egy huszáros...

C++-ban lenne egy huszáros feladatom de nem tudom megoldani?

Figyelt kérdés

Adott egy sakktáblán a huszár helye(sor,oszlop) és egy adott lépésszám (1<=N<=6). A programnak meg kell jelenítenie úgy a 8*8-as sakktáblát hogy ahova a huszár el tud jutni legfeljebb N lépésben tegyen O betűt ahová meg nem kötőjelet (-).

Ha esetleg nem írtam le mindent írjatok és előre is köszönöm a segítséget!!



2017. aug. 5. 17:06
1 2
 1/13 anonim ***** válasza:
100%
Kell egy függvény, ami megmondja, hogy tetszőleges Sor;Oszlop pozícióból hová tud lépni a ló. Ha az új pozíció a sakktáblán van, akkor arra a pozícióra meghívja saját magát a függvény (rekurzív hívás). A függvény még adjon át egy Lépésszám értéket is, amit minden hívásnál növel eggyel. Ha a Lépésszám eléri az N-et akkor nem keres tovább. A talált pozíciókba lehet O-t rakni.
2017. aug. 5. 17:23
Hasznos számodra ez a válasz?
 2/13 Hominida ***** válasza:
72%

Elvileg egy backtrack módszer kellene az ellenőrzéshez, de a csekély számú lehetőség miatt ez most elhagyható, és végigcsinálhatod az összes lehetőséget izomból.


Először a dolog algoritmusát kell megalkotnod, vagyis végiggondolnod és leírnod magadnak azt, hogy te hogyan oldanád meg a feladatot saját kézzel, táblán, figurával.


Jelöld meg az összes mezőt el nem értnek (-).

Egy mezőn állva szerintem 8 különböző lépési lehetőség van, ezeknek a kiválasztását végezd valamilyen egységes elv szerint, megszámozva őket. Válaszd az első lépést, és jegyezd fel egy N elemű vektorban, a kezdőpozíciót és hogy 1. Arról a mezőről szintén léphetsz 8 féle módon, bár az ugyanoda való visszalépést kizárhatod. Válaszd itt is az 1. irányt, a vektor 2. eleme is 1. Így tovább N lépésig. Ha közben lelépsz a tábláról, akkor nem kell tovább folytatni. Végül megjelelöd az elért mezőt.


Aztán a backtrack módszer szerint a vektorban visszalépsz egy szintet, a figurát "visszateszed" a feljegyzett mezőre, megnézed, hogy ott az előbb hányadik irányt választottad, és most kipróbálod az eggyel nagyobb számút. Ha túljutsz a 8 lehetséges irányon, akkor még egyet visszalépsz a vektorban és így tovább. Ha a feladvány kezdőmezőjéről végigpróbáltad mind a 8 lépésirányt, akkor végeztél. Primitív, de működő megoldás. Próbáld ki először táblán, papírral, tollal, utána menni fog programban is.


Ezt nyelvre átültetni már a te feladatod.

2017. aug. 5. 19:00
Hasznos számodra ez a válasz?
 3/13 anonim ***** válasza:
17%
Jó, és?
2017. aug. 5. 21:45
Hasznos számodra ez a válasz?
 4/13 A kérdező kommentje:

#1 Köszönöm megpróbálom így az alap függvény már megvan remélem sikerül.

#2 Köszönöm, még kezdő vagyok és nem igazán értem mi ez a backtrack de ment neked is a zöld kéz a válaszodért!

2017. aug. 6. 10:33
 5/13 anonim ***** válasza:

#4 Az alap függvényben nyilván 8 lehetséges pozíciót kell vizsgálnod (ennyi helyre léphet elméletileg a ló), de ezek közül lehetnek olyanok, melyek a táblán kívülre vezetnek, ezért azok eleve kiesnek. Tehát van nyolc vizsgálat, ezek mindegyike végén meghív(hat)ja saját magát a függvény.

Arra kell még ügyelni, hogy a függvény reentráns legyen, azaz ne használjon statikus változókat, mert akkor nyilván összezavarná saját futását. Tehát a függvény lokális adatokkal dolgozzon! Amikor a függvény megkapja a Sor, Oszlop és Lépésszám adatokat a híváskor, akkor ezekkel fog számolni (a Lépésszámot növeli, Sor és Oszlop pedig a pozíció kiértékeléshez kell). Ha megvan a módosított Sor és Oszlop (ahová a ló léphet), akkor a függvény hívásakor ezeket a módosított értékeket kapja meg és a Lépésszámot.

2017. aug. 6. 13:43
Hasznos számodra ez a válasz?
 6/13 Hominida ***** válasza:

Kérdező, a lehetséges lépések egy klasszikus "fa" gráffal ábrázolhatók. (Mint a lemezes könyvtárszerkezet vagy egy szőlőfürt.) Persze az algoritmus készítője tudja, hogy az ágak a valóságban miféle lépést jelentenek, a gráf az elvi vázlat. Balról haladva a tetejéről indulsz, elmész egy ág végéig. Utána az utolsó ágon vissza, a csomópontnál tovább lefelé a következő ágon az út végéig. Aztán vissza, következő ág stb. Ha az egy csomópontból kiinduló ágak elfogytak, akkor vissza eggyel, és eszerint folytatva. Amikor a gráf legfelső pontjából is felfelé akarnál lépni, akkor az eljárás véget ért. Rajzold le, érteni fogod, nagyon egyszerű elv. A programban annyi a feladat, hogy egy vektort (tömböt) kell használni, és mindig azt tárolni benne, hogy az adott számú csomópontnál hányadik ágon indulsz tovább.


Ezen az elven nagyon fellelkesültem, amikor nagyon régen először hallottam róla, hiszen így egy sakkjátszma is csak egy ugyanilyen algoritmus ellen lehet elveszíthető. Aztán kiderült, hogy a szükséges idő brutálisan sok. Ennek ellenére Commodore 64-esre írtam egy olyan programot, amely a peg solitaire játékra ( [link] keres megoldásokat. Amíg Basicben futott, elég szenvedős volt. De átírtam assemblybe, és pár nap alatt annyit találtam, mint a nyű. Még akkor is, amikor leszűkítettem a szabályt arra, hogy csak a középen maradó golyó a teljes megoldás. Valahol még meg is vannak elmentve, azt hiszem, bár jóval a vége előtt leállítottam. Szóval az algoritmus tényleg működőképes minden olyan feladványnál, ahol a választható lépések besorszámozhatók.

2017. aug. 6. 16:16
Hasznos számodra ez a válasz?
 7/13 anonim ***** válasza:
#6 Faszerkezetet építeni a lehetséges lépésekből egy elég egyszerű, és hatékonynak mondható ötlet. Amíg rá nem jössz, hogy a lehetséges lépések száma végtelenül sokra növekedhet, és nagyon rosszul skálázódik az N függvényében. Aztán rájössz, hogy a sakktáblán igazából nem is az a legfontosabb, hogy milyen lépéssorozatot hajtasz végre, hanem hogy a lépéssorozat végén hova érkezel. Az végpontok száma pedig már a legszélsőségesebb esetben is véges. Egy lépést leredukálhatunk egy egyszerű számpárosra (vízszintes, ileltve függőleges elmozdulás), és a lépéssorozat ennek az összege. Ebből azt is látjuk, hogy amíg biztosítani tudjuk, hogy a bábú a lépések során nem lép le a tábláról, a lépések sorrendje nem lényeges. Így a lehetséges állapotok száma máris radikálisan lecsökken. Ennek a megközelítésnek a nehezebbik része biztosítani hogy egy lépéskombinációnak van olyan sorrendje, ami nem lép le a tábláról útközben.
2017. aug. 6. 17:35
Hasznos számodra ez a válasz?
 8/13 anonim ***** válasza:
2017. aug. 6. 18:44
Hasznos számodra ez a válasz?
 9/13 anonim ***** válasza:
2017. aug. 6. 18:50
Hasznos számodra ez a válasz?
 10/13 anonim ***** válasza:
#9 Ez nem az a feladat, ez picit más. Ez a huszár probléma nekem is volt anno, bár nekünk nem programot kellett írni rá, hanem papíron bizonyítani/cáfolni különböző méretű táblákra.
2017. aug. 6. 19:18
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!