Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Fő függvény
- % Itt nem zajlik tényleges megoldás keresés, azt a következő két függvény oldja meg rekurzívan
- sudoku(s(C, Mtx)) :-
- solution(C, Mtx, 1, 1).
- % Megmondja, hogy az Mtx mátrix jelenlegi állása szerint az I. sorának J. oszlopába mely
- % értékek lennének helyesek, és ezeket eltárolja a SolutionVals listában
- % majd meghívja a fill függvényt akinek átadja ezt a listát
- % ha nem tudunk a cellába semmilyen helyes értéket írni, akkor nem tér vissza semmivel
- solution(C, Mtx, I, J) :-
- check(C, Mtx, I, J, SolutionVals),
- (
- SolutionVals == []
- ;
- \+ SolutionVals == [],
- fill(C, Mtx, I, J, SolutionVals, 1)
- ).
- % Kap egy Mtx mátrixot, aminek az I. sorának a J. oszlopánál vagyunk, továbbá
- % egy L listát melynek az IDX. eleménél vagyunk, mely lista pedig azt mondja meg, az előzőeknek megfelelően,
- % hogy ebbe a mezőbe ennek a listának az elemeit lehet helyesen írni.
- % A fill függvény végig megy ennek a listának az elemein rekurzívan, beleírja az aktuális mezőbe,
- % majd megy tovább a mátrixban -> kövi mezőre lépünk és meghívjuk a solution függvényt, hogy megnézzük, oda miket írhatunk,
- % és kezdődik elölről az algoritmus.
- % Ha pont a mátrix végénél vagyunk a beíráskor, az azt jelenti,
- % hogy kaptunk egy megoldást a mátrixra.
- fill(C, Mtx, I, J, L, IDX) :-
- size(Mtx, MatrixSize),
- size(L, LSize),
- (
- IDX < LSize + 1,
- getElement(L, IDX, E), % megkapjuk az L lista IDX. elemét, amit eltárolunk E -ben
- setMtx(Mtx, I, J, [v(E)], ModifiedMtx), % beleírjuk ezt az elemet a Mtx ba és eltároljuk a módosított mátrixot a ModifiedMtx -ban
- (
- I =:= MatrixSize, % a mátrix utolsó mezőjében vagyunk és van egy helyes mező értékünk,
- J =:= MatrixSize, % ami azt jelenti, hogy megoldást kaptunk, mert eddig is minden mezőbe
- format("Megoldas: ~w~n", [ModifiedMtx]) % csak olyan értéket írtunk, amik kielégítettek minden feltételt
- ;
- \+ I =:= MatrixSize, % nem utolsó sor utolsó oszlopában vagyunk
- J =:= MatrixSize, % megyünk tovább a kövi sor legelejére és keressük tovább
- Inext is I + 1, % a helyes értékeket
- solution(C, ModifiedMtx, Inext, 1)
- ;
- I =:= MatrixSize, % az utolsó sor nem utolsó oszlopában vagyunk
- \+ J =:= MatrixSize, % tehát megyünk tovább a kövi oszlopra
- Jnext is J + 1,
- solution(C, ModifiedMtx, I, Jnext)
- ;
- \+ I =:= MatrixSize, % nem az utolsó sorban vagyunk
- \+ J =:= MatrixSize, % és annak se az utolsó oszlopában
- Jnext is J + 1, % tehát simán megyünk csak tovább a kövi oszlopra
- solution(C, ModifiedMtx, I, Jnext)
- ),
- IDXnext is IDX + 1, % az aktuális mező helyes értékeit tartalmazó L lista kövi elemére megyünk
- fill(C, Mtx, I, J, L, IDXnext) % ezt úgy érjük el, hogy az IDX -et növeljük egyet, ez lesz az IDXnext, és meghívja önmagát a fill függvény
- ;
- IDX > LSize % túl mentünk az L listában, ekkor nem történik semmi
- ).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement