2013-03-21 13 views
7

Ho un problema con il mio metodo di risoluzione sudoku. Il programma funziona così; la scheda è vuota quando viene avviata, gli utenti aggiungono un paio di numeri alla lavagna e poi premendo un pulsante Risolvi il programma prova a risolverlo. Tutto funziona bene, inoltre, se metto lo stesso numero nella stessa riga. Quindi se l'utente aggiunge 1,1,0,0 ... 0. Nel puzzle non può risolverlo perché i suoi due 1 sono vicini l'uno all'altro e continueranno a cercare per sempre un sollievo anche se è irrisolvibile. puzzle. Tuttavia, se fossero tutti 0 (vuoti) lo risolverebbero subito, come se l'Id inserisse 1 e 2 nell'angolo in alto a sinistra. Se inserissi solo dei numeri casuali lo rileverò come irrisolvibile (o lo risolverà se si tratta di un enigma valido)Sudoku risolve il metodo

Sto pensando sulle linee di dire, quando theNumber == (row, col) equals thenNumber == (row+1, col), dovrebbe essere return false perché è un numero duplicato.

Questo è il codice che ho provato ad aggiungere nel metodo di risoluzione, ovviamente senza successo.

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

aiuto è molto apprezzato

+3

Hai provato ad aggiungere una sorta di convalida prima di tentare di "risolvere"? Se sai subito che il puzzle è irrisolvibile (due 1 di fila), allora non vuoi che il ciclo infinito cerchi di risolvere. – Walls

+0

@Walls Sì, ho provato a eseguire una sorta di metodo di convalida, ma non sono riuscito a farlo funzionare. Questo è il mio nuovo tentativo di "validare". Ed è quello con cui ho bisogno di aiuto. – Rob

+1

cambiando i nomi delle variabili da a, i, j renderebbe questo molto più leggibile. O alcuni commenti sarebbero molto apprezzati. Cerco di avere nomi di variabili significative e semplifica la risoluzione dei problemi. –

risposta

4

Convalida del puzzle come questo:

  1. creare un array booleano di 9 elementi.
  2. Passa attraverso ogni riga, colonna e riquadro 9x9.
    • Se si legge un numero, impostare il valore corrispondente nella matrice su true.
    • Se è già vero, lancia un errore (puzzle impossibile).
    • Dopo aver letto una riga, una colonna o una casella 9x9 reimpostare l'array booleano.
  3. Quindi, se la convalida è riuscita, chiamare il metodo di risoluzione.

EDIT: Codice sorgente

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; 
} 

non ha avuto troppo tempo per testare, ma potrebbe funzionare (?). I nomi delle variabili row/col potrebbero essere errati, perché non ho avuto il tempo di trovarlo nel tuo codice, ma non dovrebbe importare che funzioni o meno.

+0

Come sarebbe il codice nel mio metodo? Dal momento che sto avendo difficoltà a implementare una sorta di metodo di convalida. Capisco che ho bisogno di scorrere le mie righe, colonne, ma non sono davvero sicuro di come fare il passo numero 2. – Rob

+0

Devi farlo prima di chiamare il metodo di risoluzione (quello che chiama ripetutamente 'check()'. Ti suggerisco di usare tre cicli per scorrere tra righe, colonne e blocchi 9x9. Poi all'interno di essi implementare il codice che aggiorna l'array booleano e controlla gli stessi numeri Non posso fornire il codice perché non so come appare il tuo codice di soluzione, tranne il metodo 'check()' Dovresti farlo come 'if (boolean_array [found_number]) {/ * fail * /} boolean_array [found_number] = true; '. – Pietu1998

+0

Vado avanti e provo il tuo suggerimento, nel frattempo ho modificato il mio post principale e aggiunto la mia fonte. – Rob

Problemi correlati