2012-04-04 2 views
0

Ich versuche, ein Sudoku-Board über ein 2D-Array zu erzeugen: board [5] [5]. Das Sudoku-Board sollte nur eindeutige Vokale enthalten. Ich habe jedoch nur einzigartige Vokale in einer Reihe erscheinen lassen. Für die Spalten scheinen sie immer noch Duplikate zu haben. Wie soll ich eine Spalte ohne Duplikate mit dem bisherigen Code erzeugen?Wie lösche ich das Duplikat in einem 2D-Array in Java?

Hier ist der Code, den ich zum Erzeugen von eindeutigen Buchstaben in einer Reihe habe:

String [] vowels = {"A","E","I","O","U"}; 
String [][] board = new String [vowels.length][5]; 

public Actions(){ 
    int rows = 5; 
    for(int row = 0;row<rows;row++){ 
     ArrayList<String> tempVowels = new ArrayList<String>(Arrays.asList(vowels)); 
     int numVowPerLine = (int)Math.floor(Math.random()*4); 
     for(int j = 0;j<numVowPerLine;j++){ 
      do{ 
       int pos = (int)Math.floor(Math.random()*5); 
       if(board[row][pos] == null){ 
        int temp = (int)Math.floor(Math.random()*tempVowels.size()); 
        board[row][pos] = tempVowels.get(temp); 
        tempVowels.remove(temp); 
        break; 
       } 
      }while(true); 
     } 

    } 

Credits: L7ColWinters

Antwort

2

Dies steht in Zusammenhang mit einem ziemlich bekannten Problem, das Rooks Problem genannt wird.

Darf ich eine einfachere Schleife vorschlagen?

EDIT: Nach dem Lesen von Kommentaren sehe ich, dass das Problem auf jeden Vokal angewendet werden muss. Meiner Meinung nach, ist dies besser lesbar:

java.util.Random random = new Random(); 

boolean[] r_occupied; 
boolean[] c_occupied; 

for (i = 0; i < vowels.length; i++) 
    { 
    // Clear the 'occupied' information 
    r_occupied = new boolean[5]; 
    c_occupied = new boolean[5]; 

    // we will put vowel[i] 'count' times into the 'board' 
    count = random.nextInt(5); 

    for (j = 0; j < count; j++) 
     { 
     // generate a random row 
     row = random.nextInt(5); 

     // if it is already occupied, select the next one 
     while (r_occupied[row]) 
      row = (row + 1) % 5; 

     // generate a random column 
     col = random.nextInt(5); 

     // if it is already occupied, select the next one 
     while (c_occupied[col]) 
      col = (col + 1) % 5; 

     /* put the vowel at board[row][col] */ 
     r_occupied[row] = true; 
     c_occupied[col] = true; 
     board[row][col] = vowel[i]; 
     } 
    } 

Hinweis: Es wird einige Vokale überschreiben, aber das sollte in Ordnung sein.

+0

hmm ... ich verstehe, dass mit diesem Code der Code kein Duplikat hätte. Wird das gesamte 2D-Array dann aufgefüllt? – javaBeginner

+0

Erm, der Code füllt 5 Vokale in 5 richtige Steckplätze auf der 5x5-Platine. Wolltest du das nicht? Andere Positionen bleiben leer, damit Sie mit ihnen machen können, was Sie wollen. – ArjunShankar

+0

Wenn ich diesen Code versuchte, zeigt es nur einen Buchstaben in einer Reihe und gleichzeitig in einer Spalte.Mein ursprüngliches Problem war, das Duplikat durch Null zu ersetzen, um das Duplikat zu löschen. – javaBeginner

0
  1. Bevor ein zusätzliches Vokal Zeichen in einer Reihe Prüfung hinzufügen, wenn es dies bereits enthält Vokal und mit continue können Sie die anderen Vokal
  2. übergeben Sie können auch das gleiche für die Spalten mit nur Wechseltunes

vorher:

board[row][pos] = tempVowels.get(temp); 

: Schreibe:

boolean b = false; 

    for(int j = 0;j<columnLength; j++){ 
     if(board[row][j] == tempVowels.get(temp)) 
      b= true; 

     if(b == true) 
     { 
      b = false; 
      continue; 
     } 
     board[row][pos] = tempVowels.get(temp); 
    } 
+0

Bedeutet dies, dass ein Checker in der Zeile überprüft werden sollte, bevor Sie fortfahren? – javaBeginner

+0

Da das Problem besteht, gibt es Duplikate in den Spalten, aber nicht in den Zeilen. . . – javaBeginner

+0

ja du bist richtig du hast dein Problem gelöst – GingerHead

0

Wenn der Inhalt der ersten Spalte/erste Zeile ist A und Sie sind auf der ersten Spalte/zweite Reihe, Sie können ein abgeschnittenes Array verwenden, z. B. String [] availableVowels = {"E","I","O","U"};, aus dem Sie auswählen können. Wenn Sie O auswählen, wählen Sie in der ersten Spalte/dritten Zeile die Option String [] availableVowels = {"E","I","U"};. usw.

+0

Was ist, wenn das gesamte Board bereits mit Vokalen gefüllt ist? Wie kann ich das, was du gesagt hast, umsetzen? – javaBeginner

Verwandte Themen