2013-03-21 24 views
7

Mam problem z moją metodą rozwiązywania sudoku. Program działa w ten sposób; tablica jest pusta po uruchomieniu, użytkownicy dodają kilka liczb do tablicy, a następnie, naciskając przycisk Rozwiąż, program próbuje go rozwiązać. Wszystko działa dobrze, jeśli dodaję tę samą liczbę w tym samym wierszu. Więc jeśli użytkownik dodaje 1,1,0,0 ... 0. W układance nie może go rozwiązać, ponieważ jego dwie 1 obok siebie i będą po prostu trwać wiecznie, próbując znaleźć zasolenie, mimo że jest nierozwiązywalne puzzle. Jeśli jednak wszystkie były zerowe (puste), to rozwiązałoby to od razu, tak samo jak gdybym wstawił 1 i 2 w lewym górnym rogu. Gdybym tylko umieścić kilka liczb losowych w wykryje go jako nierozwiązywalny (lub będzie go rozwiązać, jeśli jest to ważne puzzle)Metoda rozwiązywania sudoku

myślę wokół linii mówiąc, kiedy theNumber == (row, col) equals thenNumber == (row+1, col), powinien return false bo to zduplikowany numer.

To jest kod, który próbowałem dodać w metodzie rozwiązywania, oczywiście bez powodzenia.

if ((puzzle.getNum(row, col) == a) == (puzzle.getNum(row + 1, col) == a)) { 
    return false; 
} 

pomoc jest mile widziana

+3

Czy próbowałeś dodać jakiś rodzaj sprawdzania poprawności przed próbą "rozwiązania"? Jeśli wiesz od razu, że zagadka jest nierozwiązywalna (dwa 1 w rzędzie), to nie chcesz nieskończonej pętli próbującej rozwiązać. – Walls

+0

@Walls Tak Próbowałem wykonać jakąś metodę sprawdzania poprawności, ale nie mogłem jej uruchomić. To jest moja nowa próba "zatwierdzenia". I właśnie tego potrzebuję pomocy. – Rob

+1

zmiana nazw zmiennych z a, i, j sprawiłaby, że byłby on bardziej czytelny. Lub niektóre komentarze byłyby bardzo mile widziane. Próbuję mieć znaczące nazwy zmiennych, co znacznie ułatwia rozwiązywanie problemów. –

Odpowiedz

4

Waliduj puzzle tak:

  1. Utwórz tablicę logiczną 9 elementów.
  2. Pętla w każdym rzędzie, kolumnie i polu 9x9.
    • Jeśli czytasz numer, ustaw odpowiednią wartość w tablicy na wartość true.
    • Jeśli jest już prawdą, wyślij błąd (niemożliwe puzzle).
    • Po odczytaniu rzędu, kolumny lub pola 9x9 zresetuj tablicę boolowską.
  3. Następnie, jeśli walidacja się powiedzie, wywołaj metodę rozwiązywania.

EDIT: Kod źródłowy

public boolean checkPuzzle() { 
    boolean[] nums = new boolean[9]; 
    for (int row = 0; row < panel.puzzleSize; row++) { 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      if (nums[puzzle[row][cell]]) return false; 
      nums[puzzle[row][cell]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    for (int col = 0; col < panel.puzzleSize; col++) { 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      if (nums[puzzle[cell][col]]) return false; 
      nums[puzzle[cell][col]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    for (int square = 0; square < panel.puzzleSize; square++) { 
     int squareCol = panel.squareSize * (square % panel.squareSize); 
     int squareRow = panel.squareSize * Math.floor(square/panel.squareSize); 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      int col = cell % panel.squareSize; 
      int row = Math.floor(cell/panel.squareSize); 
      if (nums[puzzle[squareCol + col][squareRow + row]]) return false; 
      nums[puzzle[squareCol + col][squareRow + row]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    return true; 
} 

nie miał zbyt wiele czasu, aby przetestować, ale to może działać (?). Nazwy zmiennych wiersza/col mogą być niepoprawne, ponieważ nie miałem czasu znaleźć tego w kodzie, ale nie powinno to mieć znaczenia, czy zadziała, czy nie.

+0

Jak ten kod wyglądałby w mojej metodzie? Ponieważ ciężko mi jest wdrożyć jakąś metodę sprawdzania poprawności. Rozumiem, że muszę przechodzić przez moje wiersze, kolumny, ale nie jestem pewien, jak wykonać krok 2. – Rob

+0

Musisz to zrobić przed wywołaniem metody rozwiązywania (tej, która wielokrotnie wywołuje 'check()' .Przypisz, że używasz trzech pętli do przechodzenia przez wiersze, cols i bloki 9x9. Następnie wewnątrz nich zaimplementuj kod, który aktualizuje tablicę logiczną i sprawdza te same numery.Nie mogę podać kodu, ponieważ nie wiem, jak wygląda twój kod rozwiązywania, poza metodą 'check()'. Powinieneś zrobić to jak 'if (boolean_array [found_number]) {/ * fail * /} boolean_array [found_number] = true; '. – Pietu1998

+0

Będę kontynuował i wypróbuję twoją sugestię, w międzyczasie zredagowałem mój główny post i dodałem moje źródło. – Rob