lundi 20 avril 2015

Sudoku Backtracking

Hallo Leute,
meine Hausaufgabe ist es einen Backtracking Algorithmus zum lösen von Sudokus zu schreiben.
Leider sieht mein Output aus irgendeinem Grund so aus :bahnhof::

1 2 3 4 5 6 7 8 9
4 5 6 1 2 3 0 0 0
0 0 0 0 0 0 0 0 0


0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0


0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

Hier der Code

Java Code:

  1.  
  2. package SudokuProg2;
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9. public class BacktrackingSudokuSolver implements ISudokuSolver{
  10.  
  11.  
  12.  
  13. private Sudoku sudoku;
  14. private int row=0,col=0;
  15.  
  16.  
  17.  
  18. @Override
  19. public boolean solveSudoku(ISudoku sudoku){
  20. this.sudoku=(Sudoku) sudoku;
  21. return backtracking();
  22.  
  23.  
  24.  
  25. }
  26.  
  27.  
  28. private boolean backtracking(){
  29.  
  30.  
  31.  
  32. // Funktion FindeLoesung (Stufe, Vektor)
  33. // 1. wiederhole, solange es noch neue Teil-Lösungsschritte gibt:
  34. // a) wähle einen neuen Teil-Lösungsschritt;
  35. // b) falls Wahl gültig ist:
  36. // I) erweitere Vektor um Wahl;
  37. // II) falls Vektor vollständig ist, return true; // Lösung gefunden!
  38. // sonst:
  39. // falls (FindeLoesung(Stufe+1, Vektor)) return true; // Lösung!
  40. // sonst mache Wahl rückgängig; // Sackgasse (Backtracking)!
  41. // 2. Da es keinen neuen Teil-Lösungsschritt gibt: return false // Keine Lösung!
  42.  
  43. //TODO ---------------
  44.  
  45. if (!UnusedField())//Beendet Rekursion wenn alle Felder != 0 sind
  46. return true;
  47.  
  48. for (int num = 1; num <= 9; num++){// probiert Zahlen 1-9 aus
  49. if (isValid(num,row, col)){
  50. sudoku.setNumber(row,col,num);
  51. if (backtracking())
  52. return true;
  53. sudoku.setNumber(row,col,0);
  54. }
  55. }
  56. return false;
  57. }
  58.  
  59.  
  60.  
  61.  
  62. //Durchläuft Spielfeld und setzt Variablen row,col auf den Index des nächsten freien Feldes, returnt false sonst.
  63. boolean UnusedField(){
  64. for (row = 0; row < sudoku.getSize(); row++)
  65. for (col = 0; col < sudoku.getSize(); col++)
  66. if (sudoku.getNumber(row, col) == 0)
  67. return true;
  68. return false;
  69. }
  70.  
  71. //Checkt ob Zahl in [row][col] einsetzbar ist, returnt false sonst.
  72. private boolean isValid(int number,int row,int col){
  73. return rowCheck(number,row)&&
  74. columnCheck(number,col)&&
  75. quadCheck(number,row,col);
  76. }
  77.  
  78.  
  79. private boolean columnCheck(int number,int col){
  80. for(int row=0;row<sudoku.getSize()-1;row++){
  81. if(sudoku.getNumber(row,col)==number){
  82. return false;
  83. }
  84. }
  85. return true;
  86. }
  87.  
  88.  
  89. private boolean rowCheck(int number,int row){
  90. for(int col=0;col<sudoku.getSize()-1;col++){
  91. if(sudoku.getNumber(row,col)==number){
  92. return false;
  93. }
  94. }
  95. return true;
  96.  
  97. }
  98.  
  99. private boolean quadCheck(int number,int row,int col){
  100.  
  101.  
  102. row = 3*(row/3);
  103. col = 3*(col/3);
  104. for( int r = 0; r < 3; r++ ){
  105. for( int c = 0; c < 3; c++ ){
  106. if( sudoku.getNumber(row+r,col+c) == number )
  107. return false ;
  108. }
  109. }
  110. return true ;
  111.  
  112.  
  113. }
  114.  
  115.  
  116.  
  117. }


(hier noch die sudoku klasse und die main)

Wäre dankbar für jede Hilfe

Liebe Grüße

thamaz


Sudoku Backtracking

0 commentaires:

Enregistrer un commentaire