Kezdőoldal » Számítástechnika » Programozás » Ez hogyan oldható meg?

Feels kérdése:

Ez hogyan oldható meg?

Figyelt kérdés

Adott egy nxm méretű (0<n,m<100) „betű-mátrix” és egy n+m-1 hosszú karakterlánc, amelyeknek

elemei az angol ABC kisbetűi. Hány (1,1) indexű cellából (n,m) indexű cellába vezető út mentén (az (i,j)

cellából az (i+1,j) vagy (i,j+1) cellák valamelyikébe lehet tovább lépni, amennyiben ezek léteznek)

található meg az n+m-1 hosszú input karakterlánc?



Tehát ha jól gondolom akkor az első betűtől kezdve minden lehet lehetséges esetet ki kellene próbálni.

Addig eljutottam, hogy lépésenként összehasonlítsam a

a keresendő soron következő betüjével, de hogyan érhetem el, hogy minden lehetséges lépéskombinációt kipróbáljon, anélkül, hogy

ugyanazt megcsinálná kétszer.


Ha jól tudom a backtrackingnek az a lényege, hogy ha nem megfelelő a következő , akkor egyet visszalép.Például ha a jobbra lépés(j+1) nem jó,akkor lefelé lép(i+1) és ha az jó akkor arra lép tovább, de hogyan lehet hogy a következő kereséskor ne ugyanazon az útvonalon menjen végig és ne hagyjon ki egy lehetőséget sem?


Egyáltalán így kellene ezt megoldani?

A segítséget előre is köszönöm.



2017. szept. 8. 14:20
 1/10 A kérdező kommentje:
És ha valaki el tudná magyarázni/tudna linkelni valamit, ahol érthetően el van magyarázva a backtracking használata és működése az is jó lenne.
2017. szept. 8. 14:24
 2/10 A kérdező kommentje:
Arra gondoltam, hogy le kell "menteni" a már megtett útvonalakat,de ennél biztos van hatékonyabb módszer is nem?
2017. szept. 8. 14:27
 3/10 anonim ***** válasza:

En egy rekurziv algoritmust irnek erre:


proc vizsgal(i, j):

_ ha rossz betu van az (i,j) cellaban, visszater hamissal

_ ha a sarkon vagyunk (i=n es j=m), visszater igazzal

_ ha van lefele hely es vizsgal(i+1, j) igaz, visszater igazzal

_ ha van jobbra hely es vizsgal(i, j+1) igaz, visszater igazzal

_ egyebkent hamissal ter vissza


Ha az utjara is kivancsi vagy, akkor az utolso n+m-1 visszateres (i,j) poziciojat tarold.

2017. szept. 8. 15:30
Hasznos számodra ez a válasz?
 4/10 anonim ***** válasza:
0%

Le van írva kiscsillió helyen az algoritmus.

Google a barátod.

2017. szept. 8. 16:22
Hasznos számodra ez a válasz?
 5/10 sharkxxx ***** válasza:
2017. szept. 8. 16:32
Hasznos számodra ez a válasz?
 6/10 A kérdező kommentje:
Köszönöm, hogy leírtad az egész kódot, de mivel nem teljesen tiszta röviden leírnád a logikát ami alapján megoldottad?(egyébként mire való a ranomSeed, mert nekem mindig ugyanazt a mátrixot és stringet generálja,de ez most mellékes )
2017. szept. 8. 17:18
 7/10 sharkxxx ***** válasza:

Mivel C++-ban kellett programozni, ami objektum orientált nyelv, ezért készítettem egy osztályt (class Matrix).

Ebben az oszályban van tárolva az mátrix (mx) és a string (s).


A fillMatrix() feltölti a mátrixot.

A fillString() feltölti a stringet.

A showMatrix() megjeleníti a mátrixot.

A showString() megjeleníti a stringet.


A mátrix és a string feltöltésénél van egy kis random variáció.

A randomSeed változóval tudod állítani, hogy minden futatásnál más-más mátrixot és stringet genereljon (randomSeed=time(NULL)),

vagy ha a randomSeed változónak egy konstans számot adol, akkor mindig ugyanazt a véletlen mátrixot és stringet fogja generálni (randomSeed=1504880612).

Ajánlom, hogy a "randomSeed=1504880612" parancsot inkább töröld ki.


A getCorrectPathCount() visszaadja, hogy mennyi helyes útvonalon található meg a string a mátrixban.

Ez egy rekurzív fügvénnyel van megvalósítva (countPaths()).

A countPaths() függvénynek 3 bemeneti (i,j,k) és 1 kimeneti (pathCount) paramétere van.

i - A mátrix egyik koordinátája

j - A mátrix másik koordinátája

k - A string indexe

pathCount - Visszaadja, hogy hány darab helyes útvonalon található meg a string a mátrixban a megadott mátrix koordinátától és a megadott string indextől számítva.


void Matrix::countPaths(const int i, const int j, const int k, int & pathCount) const

{

    char c;

    c = mx[i*m+j]; // Ilyen betű van a megadott matrix koordinátán.

    if (s[k] == c) { // Ha a string betűje a megadott indexen egyezik a mátrix betűjével, akkor

        if (k == (s.length()-1)) { // Ha a string indexe az utolsó betűre mutat, akkor

            pathCount++; // Találtunk még egy helyes útvonalat.

        } else {

            if ((k+1) < s.length()) { // Ha van még olyan betű a stringben, amit még nem ellenőriztünk, akkor

                if ((i+1) < n) { // Ha van még olyan betű a mátrixban, amit még nem ellenőriztünk, akkor

                    countPaths(i+1, j, k+1, pathCount); // Mennyi helyes útvonalon található meg a string a mátrixban a következő mátrix koordinátától és a következő string indextől számítva.

                }

                if ((j+1) < m) { // Ha van még olyan betű a mátrixban, amit még nem ellenőriztünk, akkor

                    countPaths(i, j+1, k+1, pathCount); // Mennyi helyes útvonalon található meg a string a mátrixban a következő mátrix koordinátától és a következő string indextől számítva.

                }

            }

        }

    }

}


A countPaths() egy rekurzív függvény.

Hogy hogyan kell rekurzív függvényt készíteni?

Rekurzív függvény készítésnél át kell gondolni, hogy milyen bemeneti és milyen kimeneti értékekre lesz szükségünk.

Valahol a függvényben lesz legalább egy parancs, ami meghívja ugyanazt a függvényt. De más paraméterekkel. Ugyhogy a paramétertervezés fontos.

Arra vigyázni kell, hogy a függvény ne hívja meg saját magát végtelenszer. Vagyis legyen benne egy olyan pont, amikor már nem fogja saját magát többször meghívni.

2017. szept. 8. 19:50
Hasznos számodra ez a válasz?
 8/10 A kérdező kommentje:
Nagyon nagyon köszi az elképesztően hasznos és alapos válaszaidat, nagyon sokat segítettél:)
2017. szept. 8. 20:18
 9/10 A kérdező kommentje:
Csak még egy kérdés a kódban a "separator"(94 sor) mit csinál,mire való, illetve, hogyan tárolod a mátrixot 2D tömb nélkül?(egy charban?)
2017. szept. 9. 19:16
 10/10 anonim ***** válasza:

Hogy tárolna már egy mátrixot egy charban??

Egy dimenziós tömbben is lehet, csak csúnyább.

2017. szept. 9. 20:55
Hasznos számodra ez a válasz?

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!