SHARE
TWEET

Untitled

a guest Nov 19th, 2019 135 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. % Fő függvény
  2. % Itt nem zajlik tényleges megoldás keresés, azt a következő két függvény oldja meg rekurzívan
  3.  
  4. sudoku(s(C, Mtx)) :-
  5.     solution(C, Mtx, 1, 1).
  6.  
  7. % Megmondja, hogy az Mtx mátrix jelenlegi állása szerint az I. sorának J. oszlopába mely
  8. % értékek lennének helyesek, és ezeket eltárolja a SolutionVals listában
  9. % majd meghívja a fill függvényt akinek átadja ezt a listát
  10. % ha nem tudunk a cellába semmilyen helyes értéket írni, akkor nem tér vissza semmivel
  11.  
  12. solution(C, Mtx, I, J) :-
  13.     check(C, Mtx, I, J, SolutionVals),
  14.     (
  15.         SolutionVals == []
  16.         ;
  17.         \+ SolutionVals == [],
  18.         fill(C, Mtx, I, J, SolutionVals, 1)
  19.     ).
  20.  
  21. % Kap egy Mtx mátrixot, aminek az I. sorának a J. oszlopánál vagyunk, továbbá
  22. % egy L listát melynek az IDX. eleménél vagyunk, mely lista pedig azt mondja meg, az előzőeknek megfelelően,
  23. % hogy ebbe a mezőbe ennek a listának az elemeit lehet helyesen írni.
  24. % A fill függvény végig megy ennek a listának az elemein rekurzívan, beleírja az aktuális mezőbe,
  25. % 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,
  26. % és kezdődik elölről az algoritmus.
  27. % Ha pont a mátrix végénél vagyunk a beíráskor, az azt jelenti,
  28. % hogy kaptunk egy megoldást a mátrixra.
  29.  
  30. fill(C, Mtx, I, J, L, IDX) :-
  31.     size(Mtx, MatrixSize),
  32.     size(L, LSize),
  33.     (
  34.         IDX < LSize + 1,
  35.         getElement(L, IDX, E),                          % megkapjuk az L lista IDX. elemét, amit eltárolunk E -ben
  36.         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
  37.         (
  38.             I =:= MatrixSize,                           % a mátrix utolsó mezőjében vagyunk és van egy helyes mező értékünk,
  39.             J =:= MatrixSize,                           % ami azt jelenti, hogy megoldást kaptunk, mert eddig is minden mezőbe
  40.             format("Megoldas: ~w~n", [ModifiedMtx])     % csak olyan értéket írtunk, amik kielégítettek minden feltételt
  41.             ;
  42.             \+ I =:= MatrixSize,                        % nem utolsó sor utolsó oszlopában vagyunk
  43.             J =:= MatrixSize,                           % megyünk tovább a kövi sor legelejére és keressük tovább
  44.             Inext is I + 1,                             % a helyes értékeket
  45.             solution(C, ModifiedMtx, Inext, 1)         
  46.             ;
  47.             I =:= MatrixSize,                           % az utolsó sor nem utolsó oszlopában vagyunk
  48.             \+ J =:= MatrixSize,                        % tehát megyünk tovább a kövi oszlopra
  49.             Jnext is J + 1,
  50.             solution(C, ModifiedMtx, I, Jnext)
  51.             ;
  52.             \+ I =:= MatrixSize,                        % nem az utolsó sorban vagyunk
  53.             \+ J =:= MatrixSize,                        % és annak se az utolsó oszlopában
  54.             Jnext is J + 1,                             % tehát simán megyünk csak tovább a kövi oszlopra
  55.             solution(C, ModifiedMtx, I, Jnext)
  56.         ),
  57.         IDXnext is IDX + 1,                             % az aktuális mező helyes értékeit tartalmazó L lista kövi elemére megyünk
  58.         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
  59.         ;
  60.         IDX > LSize                                     % túl mentünk az L listában, ekkor nem történik semmi
  61.     ).
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top