Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  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. ).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement