Sudoku-Algorithmus mit backtracking - java

Also ich habe das university Zuordnung zu lösen Sudoku... habe ich gelesen, Algorithmus X und Tanz Algorithmus, aber Sie wollten mir nicht helfen.

Ich brauche, um es mit backtracking. Ich hart codiert einige Indizes in den zwei-dimensionales array mit den zahlen auf den Plätzen, die von Wikipedia (so bin ich mir sicher, dass es lösbar ist).

Den code, den ich habe ist folgende:

public void solveSudoku(int row, int col)
   {
      //clears the temporary storage array that is use to check if there are
      //dublicates on the row/col
      for (int k = 0; k < 9; k++)
      {
         dublicates[k] = 0;
      }
      //checks if the index is free and changes the input number by looping
      //until suitable
      if (available(row, col))
      {
         for (int i = 1; i < 10; i++)
         {
            if (checkIfDublicates(i) == true)
            {
               board[row][col] = i;
               if (row == 8)
                  solveSudoku(0, col + 1);
               else if (col == 8)
                  solveSudoku(row + 1, 0);
               else
                  solveSudoku(row, col + 1);

               board[row][col] = 0;
            }
         }
      }
      //goes to the next row/col
      else
      {
         if (row == 8)
            solveSudoku(0, col + 1);
         else if (col == 8)
            solveSudoku(row + 1, 0);
         else
            solveSudoku(row, col + 1);
      }
   }

   /**
    * Checks if the spot on the certain row-col index is free of element
    * 
    * @param row
    * @param col
    * @return
    */
   private boolean available(int row, int col)
   {
      if (board[row][col] != 0)
         return false;
      else
         return true;
   }

   /**
    * Checks if the number given is not already used in this row/col
    * 
    * @param numberToCheck
    * @return
    */
   private boolean checkIfDublicates(int numberToCheck)
   {
      boolean temp = true;
      for (int i = 0; i < dublicates.length; i++)
      {
         if (numberToCheck == dublicates[i])
         {
            temp = false;
            return false;
         }
         else if (dublicates[i] == 0)
         {
            dublicates[i] = numberToCheck;
            temp = true;
            return true;
         }
      }
      return temp;
   }

Ich bin immer StackOverflow auf

//goes to the next row/col
          else
          {
             if (row == 8)
                solveSudoku(0, col + 1);
             else if (col == 8)
                solveSudoku(row + 1, 0);
             else
                solveSudoku(row, col + 1);
          }

was bedeutet, dass ich haben, um zu stoppen die Rekursion irgendwann, aber ich kann nicht herausfinden, wie!
Wenn Sie feststellen, andere Fehler in der solve() - Funktion - lassen Sie es mich wissen. Weil ich bin nicht sicher, ich verstehe die "backtracking" - Ding komplett...

  • byteauthor.com/2010/08/sudoku-solver hat ein schönes Beispiel dazu.
  • Wiki zu 😉
  • Sie sollten sich auf Ihre dublicates code. Ich sehe nicht, wie das überprüfen könnte, ob eine Zahl erlaubt ist. Sie es jederzeit zurücksetzen (mit jedem SolveSudoku nennen), damit es alles vergisst. Ich habe auch meine Zweifel, wie ein array mit 9 Elementen kann alles überprüfen
InformationsquelleAutor Milkncookiez | 2012-11-14
Schreibe einen Kommentar