2016-04-21 4 views
0

Ich schreibe einen Sudoku-Löser und ich habe seit mehreren Stunden fest, ich kann es einfach nicht zur Arbeit gehen.Sudoku-Löser, holen Sie die Felder auf die richtige Kachel

Der Solver kann jede beliebige Platte mit bis zu 64 Kacheln aufnehmen, und die Kisten können jede rechteckige Form haben. Ich habe die Boards erstellt und alle Kacheln in einem zweidimensionalen Array erstellt, damit dieser Teil in Ordnung ist. Die Probleme treten auf, wenn ich die gleichen Fliesen in ihre Schachtel legen möchte.

0 -> 0 1 0 | 0 0 4 <- 1 
     0 0 0 | 8 0 0 
     ------------- 
2 -> 0 0 0 | 0 0 1 <- 3 
     1 0 0 | 2 7 0 
     ------------- 
4 -> 0 0 0 | 9 0 0 <- 5 
     0 2 0 | 0 0 0 

Also eine Platine wie diese, die Boxen sind nummeriert wie oben gezeigt, von links nach rechts. Und die Fliesen sind wie folgt nummeriert:

tile[row][column] 

z: Die „4“ in der rechten oberen Ecke ist eine Fliese [0] [5] auf dem Brett.

So jetzt zu dem Problem zur Hand. Die Boxen haben ein zweidimensionales Array in der Größe der Box, und jedes Array sollte auf die rechte Kachel auf der Platine zeigen. Das Board und die Boxen sind bereits erstellt, ich brauche nur das Array der Box, um auf die richtige Kachel auf dem Board zu zeigen.

zB: Box-Nummer „3“ sollte zweidimensionale Anordnung mit sechs Werten Wesen haben:

[0][0] = 0; [0][1] = 0; [0][2] = 1; 
[1][0] = 2; [1][2] = 7; [1][3] = 0; 

ich viel für-Schleife Verschachtelung versucht, aber ich kann es nicht die Pick bekommen richtige Kacheln für jedes gegebene Szenario. Das gegebene Sudoku-Brett kann irgendeine Größe mit Kästen haben, die in irgendeiner rechteckigen Form geformt sind.

Edit: Der Code, den ich geschrieben habe, ist norwegisch, fragen Sie, ob etwas unklar ist.

Edit2: Das Problem liegt in der letzten Methode der Brett-Klasse.

class SudokuSolver { 
    public static void main(String[] args) throws Exception { 
     Brett sudoku = lesFil(args[0]); 



    } 

    //Creates the sudoku board from a txt-file. 
    public static Brett lesFil(String filnavn) throws Exception { 
     Scanner fil = new Scanner(new File(filnavn)); 
     String linje = ""; 

     int antRad = Integer.parseInt(fil.nextLine()); 
     int antKol = Integer.parseInt(fil.nextLine()); 
     int antBoks = 0; 
     //antall Bo(kser), Ra(der) og Ko(lonner) 
     int antBoRaKo = antRad * antKol; 
     Brett nyttBrett = new Brett(antBoRaKo, antRad, antKol); 
    nyttBrett.bokser[antBoks] = new Boks(antBoRaKo); 

     for(int i = 0; fil.hasNextLine(); i++) { 
      if(i == antRad) { 
     antBoks++; 
       nyttBrett.bokser[antBoks] = new Boks(antBoRaKo); 
      } 
      linje = fil.nextLine(); 

      for(int j = 0; j < linje.length(); j++) { 
       if(j == antKol) { 
      antBoks++; 
        nyttBrett.bokser[antBoks] = new Boks(antBoRaKo); 
       } 

       Rute nyRute = new Rute(tegnTilVerdi(linje.charAt(j))); 
       nyttBrett.ruter[i][j] = nyRute; 
       nyttBrett.bokser[antBoks-1].ruter[i][j] = nyRute; 
      } 
     } 

     return nyttBrett; 
    } 

    //Sign to value. 
    //Gikk utifra at 0 skal representere en tom rute. 
    public static int tegnTilVerdi(char tegn) { 
     if (tegn == '.') { 
      return 0; 
     } else if ('1' <= tegn && tegn <= '9') { // tegn er i [1, 9] 
      return tegn - '0'; 
     } else if ('A' <= tegn && tegn <= 'Z') { // tegn er i [A, Z] 
      return tegn - 'A' + 10; 
     } else if (tegn == '@') {     // tegn er @ 
      return 36; 
     } else if (tegn == '#') {     // tegn er # 
      return 37; 
     } else if (tegn == '&') {     // tegn er & 
      return 38; 
     } else if ('a' <= tegn && tegn <= 'z') { // tegn er i [a, z] 
      return tegn - 'a' + 39; 
     } else {         // tegn er ugyldig 
      return -1; 
     } 
    } 
} 

//Board-class where I am trying to match the boxes with the board. 
class Brett { 
Rute[][] ruter; 
Boks[] bokser; 
//antall bokser, antall rader og kolonner i hver boks. 
int antBoks, antRad, antKol; 

Brett(int antBoks, int antRad, int antKol) { 
    ruter = new Rute[antBoks][antBoks]; 
    bokser = new Boks[antBoks]; 
    this.antBoks = antBoks; 
    this.antRad = antRad; 
    this.antKol = antKol; 
} 

//My last try of many, probably not my best try. 
public void ruterIBoks2() { 
    int cntRad = 0; 
    for(int k = 0; k < antBoks; k++) { 
     int cntKol = 1 * k; 
     for(int i = 0; i < antRad; i++) { 
      for(int j = 0; j < antKol; j++) { 
       bokser[i][j] = ruter[cntRad][cntKol - 1]; 
       cntKol++; 
      } 
      cntRad++; 
     } 
    } 
} 
+1

Können Sie Ihren aktuellen Code posten und genau auf das Problem im aktuellen Code zeigen? – Draken

Antwort

1

Das Problem aus dem cntKol Variable in Ihrem ruterIBoks2 Verfahren kommen kann.

Sie setzen es auf k * 1 (wo Sie es einfach auf k setzen könnte), die zunächst gleich 0 ist, da es Ihre for Bedingung ist.

Das Problem ist, dass Sie auf das cntKol - 1 ten Element in Ihrem Array zugreifen möchten.

bokser[i][j] = ruter[cntRad][cntKol - 1];

Oder in anderen Worten das -1th Element, das wahrscheinlich die Ursache Ihrer Probleme ist.

Verwandte Themen