Unterquadrate bei Sudoku füllen

hvboede

Mitglied
Aufgabe: Ich will Unterquadrate eines Sudoku mit schon fixierten Werten so füllen, das die Zahlen 1-9
einmal darin vorkommen.


dafür habe ich die Methode

Java:
  public static void unterquadrat(int[] hilfsarray) {
        boolean schondrin = false;
        int zaehler = 0, a;
        while (zaehler < hilfsarray.length) {
            if (hilfsarray[zaehler] > 0) {
                zaehler++;
            } else {
//                Suche solange eine Zufallszahl zwischen 1 und 9, bis du eine gefunden hast die noch nicht im array vorkommt dann schreibe sie rein
                while (hilfsarray[zaehler] == 0) {
                    a = (int) (Math.random() * 8 + 1);

                    for (int q = 0; q < hilfsarray.length; q++) {
                        if (hilfsarray[q] == a) {
                            schondrin = true;
                        }
                    }


                    if (schondrin == false) {
                        hilfsarray[zaehler] = a;
                    }

                    schondrin = false;
                }
                zaehler++;
            }
        }
    }


sie funktioniert z.b. für die Instanz 0 9 0
6 0 0
0 0 0

aber für die Instanz 0 0 0
0 8 0
0 7 0

nicht, oder braucht zumindest viel länger so das ich darauß schließe, dass sie überhaupt nicht funktioniert.
Ich hoffe das jemand den Grund sieht und mir helfen kann


mfg
 

Final_Striker

Top Contributor
Ich würde es so machen:

- alle Zahlen die noch fehlen in einem Array oder einer Liste sammeln
- Array oder Liste mischen
- mit den gemischten Zahlen die Quadrat füllen
 

timbeau

Gesperrter Benutzer
Dein Algorithmus ist nicht deterministisch. Soll heißen, das theoretisch dein PC unendlich lang Randomwerte ausspuckt die du aber schon hast.

Besser wäre ein Vorgehen, dass du in einer Liste die noch möglichen Zahlen speicherst und dir dann eine Zufallszahl generieren lässt von 0 bis Liste.size()-1. Dann kannst du die Felder durchgehen und bei jedem den Zufallsaglo laufen lassen und diese Zahl dann aus der Liste rausnehmen.
 

hvboede

Mitglied
das Problem ist glaube ich, dass er Unterquadrate in denen noch keine 9 fixiert ist nicht lösen kann, weil

a = (int) (Math.random() * 8 + 1); nur Zufallszahlen bis 8 generiert.

Kann mir da jemand weiterhelfen?


mfg
 
H

hüteüberhüte

Gast
Ein Unterquadrat kann ja erst dann vollständig ausgefüllt werden, wenn für jedes Feld nur ein Kandidat zum ausfüllen übrig bleibt. Also wiederholt für jedes Feld verbleibende Kandidaten sammeln und immer, wenn nur einer übrig ist, diesen eintragen.

Würde einfach über die 9 Felder iterieren, jedes mal prüfen, ob schon ausgefüllt und ggf. die Kandidaten wie oben beschriebenen ermitteln. Funktioniert das?
 
H

hüteüberhüte

Gast
Ach so, es geht darum, die 9 Felder einfach mit zufälligen Zahlen von 1 bis 9 zu füllen, ohne Doppelte dabei/in dem Quadrat zu haben, unabhängig davon, ob sie zum "Rest" des Sudokus passen oder nicht.

Dann könnte das einfach so gehen:

Java:
package javaforum;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        int[] einQuadrat = {0, 0, 5, 0, 0, 6, 0, 8, 9};

        Set<Integer> vorhandene = new HashSet<Integer>();
        for (int i = 0; i < einQuadrat.length; i++) {
            vorhandene.add(einQuadrat[i]);
        }

        List<Integer> kandidaten = new LinkedList<Integer>();
        for (int i = 1; i <= 9; i++) {
            kandidaten.add(i);
        }
        Collections.shuffle(kandidaten);

        for (int i = 0; i < einQuadrat.length; i++) {
            if (einQuadrat[i] == 0) {
                while (vorhandene.contains(kandidaten.get(0))) {
                    kandidaten.remove(0);
                }
                einQuadrat[i] = kandidaten.get(0);
                vorhandene.add(kandidaten.remove(0));
            }
        }

        System.out.println(Arrays.toString(einQuadrat));
    }
}

einQuadrat ist in diesem Fall das Quadrat, welches ausgefüllt werden soll

vorhandene ist ein Set, das sich bereits ausgefüllte Zahlen merkt

kandidaten ist eine gemischte Liste mit Zahlen, die zum ausfüllen benutzt werden können

Es wird nur einmal über das Array iteriert, dabei wird nur dann der erste "Listen-Kandidat" eingetragen, wenn er (in dem Quadrat) noch nicht vorhanden war
 
H

hüteüberhüte

Gast
Ja, mir auch^^ und wenn man es leicht umändert, geht es auch mit vergleichsweise großen Arrays:

Java:
        long t1 = System.currentTimeMillis();

        int[] einQuadrat = new int[999999];
        einQuadrat[7] = 7;
        einQuadrat[77] = 77;
        einQuadrat[100] = 100;

        Set<Integer> vorhandene = new HashSet<Integer>();
        for (int i = 0; i < einQuadrat.length; i++) {
            vorhandene.add(einQuadrat[i]);
        }

        List<Integer> kandidaten = new LinkedList<Integer>();
        for (int i = 1; i <= einQuadrat.length; i++) {
            kandidaten.add(i);
        }
        Collections.shuffle(kandidaten);

        for (int i = 0; i < einQuadrat.length; i++) {
            if (einQuadrat[i] == 0) {
                while (vorhandene.contains(kandidaten.get(0))) {
                    kandidaten.remove(0);
                }
                einQuadrat[i] = kandidaten.get(0);
                vorhandene.add(kandidaten.remove(0));
            }
        }

        long t2 = System.currentTimeMillis();

        // System.out.println(Arrays.toString(einQuadrat));
        System.out.println(t2 - t1);
Laufzeit: ~2400ms

Tauscht man LinkedList gegen ArrayList und wählt immer das letzte Element:

Java:
        long t1 = System.currentTimeMillis();

        int[] einQuadrat = new int[999999];
        einQuadrat[7] = 7;
        einQuadrat[77] = 77;
        einQuadrat[100] = 100;

        Set<Integer> vorhandene = new HashSet<Integer>();
        for (int i = 0; i < einQuadrat.length; i++) {
            vorhandene.add(einQuadrat[i]);
        }

        List<Integer> kandidaten = new ArrayList<Integer>(einQuadrat.length);
        for (int i = 1; i <= einQuadrat.length; i++) {
            kandidaten.add(i);
        }
        Collections.shuffle(kandidaten);

        for (int i = 0; i < einQuadrat.length; i++) {
            if (einQuadrat[i] == 0) {
                while (vorhandene.contains(kandidaten.get(kandidaten.size() - 1))) {
                    kandidaten.remove(kandidaten.size() - 1);
                }
                einQuadrat[i] = kandidaten.get(kandidaten.size() - 1);
                vorhandene.add(kandidaten.remove(kandidaten.size() - 1));
            }
        }

        long t2 = System.currentTimeMillis();

        // System.out.println(Arrays.toString(einQuadrat));
        System.out.println(t2 - t1);
...ist die Laufzeit: ~1600ms

Fügt man zusätzlich noch eine ArrayDeque ein:

Java:
        long t1 = System.currentTimeMillis();

        int[] einQuadrat = new int[999999];
        einQuadrat[7] = 7;
        einQuadrat[77] = 77;
        einQuadrat[100] = 100;

        Set<Integer> vorhandene = new HashSet<Integer>();
        for (int i = 0; i < einQuadrat.length; i++) {
            vorhandene.add(einQuadrat[i]);
        }

        List<Integer> kandidaten = new ArrayList<Integer>(einQuadrat.length);
        for (int i = 1; i <= einQuadrat.length; i++) {
            kandidaten.add(i);
        }
        Collections.shuffle(kandidaten);

        Deque<Integer> kandidaten2 = new ArrayDeque<Integer>(kandidaten);

        for (int i = 0; i < einQuadrat.length; i++) {
            if (einQuadrat[i] == 0) {
                while (vorhandene.contains(kandidaten2.peek())) {
                    kandidaten2.poll();
                }
                einQuadrat[i] = kandidaten2.peek();
                vorhandene.add(kandidaten2.poll());
            }
        }

        long t2 = System.currentTimeMillis();

        // System.out.println(Arrays.toString(einQuadrat));
        System.out.println(t2 - t1);
...gewinnt man nix und die benötigte Laufzeit verschlechtert sich: ~2050ms

Laut API ( ArrayDeque (Java Platform SE 6) ):
This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.
...ist ArrayDeque ja schneller als Stack und schneller als LinkedList, was gegenüber ArrayList aber keinen Vorteil darstellt.

Eine Alternative wäre es noch, kandidaten durch ein einfaches Array zu ersetzen. Dann werden aber zusätzliche Variablen benötigt, was die collection classes von sich aus schon bieten:

Java:
        long t1 = System.currentTimeMillis();

        int[] einQuadrat = new int[999999];
        einQuadrat[7] = 7;
        einQuadrat[77] = 77;
        einQuadrat[100] = 100;

        Set<Integer> vorhandene = new HashSet<Integer>();
        for (int i = 0; i < einQuadrat.length; i++) {
            vorhandene.add(einQuadrat[i]);
        }

        int[] kandidaten = new int[einQuadrat.length];
        for (int i = 1; i <= einQuadrat.length; i++) {
            kandidaten[i - 1] = i;
        }
        for (int i = 0; i < kandidaten.length; i++) {
            int j = (int) (Math.random() * kandidaten.length);
            int k = kandidaten[i];
            kandidaten[i] = kandidaten[j];
            kandidaten[j] = k;
        }

        int j = 0;
        for (int i = 0; i < einQuadrat.length; i++) {
            if (einQuadrat[i] == 0) {
                while (vorhandene.contains(kandidaten[j])) {
                    j++;
                }
                einQuadrat[i] = kandidaten[j];
                vorhandene.add(kandidaten[j++]);
            }
        }

        long t2 = System.currentTimeMillis();

        // System.out.println(Arrays.toString(einQuadrat));
        System.out.println(t2 - t1);
...unterscheidet sich in der Laufzeit nicht zu der Variante mit ArrayList.

Genug getestet für den Moment/heut e^^ (Für ein Danke wäre ich dankbar^^)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Sudoku mit 2D Arrays Java Basics - Anfänger-Themen 19
B Sudoku prüfen Java Basics - Anfänger-Themen 13
S GUI-Programmierung Sudoku-Rätsel lösen Java Basics - Anfänger-Themen 1
J Sudoku mehrere Lösungen Java Basics - Anfänger-Themen 29
J Sudoku Blocküberprüfung Java Basics - Anfänger-Themen 9
S Sudoku Checker Frage Java Basics - Anfänger-Themen 1
G Sudoku Java Basics - Anfänger-Themen 3
S Methoden Java Sudoku Solver Java Basics - Anfänger-Themen 2
C Klassen Sudoku-Spiel Werte werden nicht gesetzt Java Basics - Anfänger-Themen 4
A Sudoku mit Backtracking lösen Java Basics - Anfänger-Themen 3
L Sudoku Backtracking Pseudocode Java Basics - Anfänger-Themen 3
L Sudoku Löser Java Basics - Anfänger-Themen 9
V Sudoku-Solver Probleme bei der Fehlerbehandlung Java Basics - Anfänger-Themen 12
D Sudoku lösen mit Backtracking Java Basics - Anfänger-Themen 20
M Sudoku-Löser: Fragen zu Pointer und Rekursion Java Basics - Anfänger-Themen 15
S Bisschen hilfe beim Sudoku Lösen benötigt Java Basics - Anfänger-Themen 7
X Sudoku Backtracking Java Basics - Anfänger-Themen 6
S Sudoku hilfe Java Basics - Anfänger-Themen 4
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
N Sudoku/BLocküberprüfung Java Basics - Anfänger-Themen 24
F Sudoku Grid zeichnen Java Basics - Anfänger-Themen 2
C Frage zu Sudoku Java Basics - Anfänger-Themen 20
MEETyA NullPointer Exception - Sudoku Java Basics - Anfänger-Themen 2
J Sudoku-ähnliche Aufgabe Java Basics - Anfänger-Themen 3
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
Antoras Sudoku Java Basics - Anfänger-Themen 3
F sudoku generieren Java Basics - Anfänger-Themen 16
B Sudoku! Java Basics - Anfänger-Themen 26
G Area mit Teil-Image füllen Java Basics - Anfänger-Themen 0
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
emx-zee Erste Schritte NullPointerException, Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 2
Poppigescorn String mit mehreren Wörtern füllen? Java Basics - Anfänger-Themen 4
sashady 2D-Array mit Zahlenmuster füllen Java Basics - Anfänger-Themen 4
J Ist es möglich einen int Array wirklich leer zu initialisieren oder zu füllen? Java Basics - Anfänger-Themen 21
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
Z Char Array an zufälligen stellen mit einem "x" füllen. Java Basics - Anfänger-Themen 4
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
T Array füllen Java Basics - Anfänger-Themen 11
B Objekt von EJB in Controller (CDI) - Klasse füllen? Java Basics - Anfänger-Themen 3
J Combobox füllen mit Wertausgabe von andere Klasse Java Basics - Anfänger-Themen 3
A Array richtig füllen Java Basics - Anfänger-Themen 2
krgewb Array später füllen Java Basics - Anfänger-Themen 1
E Arrays nach best Muster füllen Java Basics - Anfänger-Themen 4
A Ein Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 4
M jTabel mit Daten Füllen Java Basics - Anfänger-Themen 5
neerual Feld mit Einsen und Nullen füllen und überschreiben Java Basics - Anfänger-Themen 1
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
B Array via Schleife mit ungeraden bzw geraden Zahlen füllen Java Basics - Anfänger-Themen 7
G Model mit Models füllen Java Basics - Anfänger-Themen 9
T Best Practice Liste geschickt füllen Java Basics - Anfänger-Themen 5
Bluedaishi Datum in Jtextarea füllen Java Basics - Anfänger-Themen 5
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
D Best Practice Objekt automatisch im Konstruktor füllen? Java Basics - Anfänger-Themen 9
L Feld mit beliebiger Anzahl von Buchstaben füllen... Java Basics - Anfänger-Themen 5
A Methoden Array mit Methode nacheinander füllen Java Basics - Anfänger-Themen 3
T Arrays mit Schleife füllen Java Basics - Anfänger-Themen 11
D JComboboxen in Abhängigkeiten füllen Java Basics - Anfänger-Themen 7
K Array mit for-each Schleife füllen Java Basics - Anfänger-Themen 5
Z Array-Index einmalig je mit Random füllen Java Basics - Anfänger-Themen 7
K "Elegantes" Füllen eines Models? Java Basics - Anfänger-Themen 20
W String in einer Zeile mit Alphabet füllen? Java Basics - Anfänger-Themen 8
K String Array basierend auf int Array füllen Java Basics - Anfänger-Themen 2
Y Erste Schritte Spielfeld, Array füllen mit Treffern...?! Java Basics - Anfänger-Themen 3
B generische LinkedList nach Häufigkeit der Elemente füllen Java Basics - Anfänger-Themen 6
N Arrays mit Zufallzahlen füllen und Statistiken berechnen Java Basics - Anfänger-Themen 5
K Zweidimensionales Array erstellen und zufällig mit 0 und 1 füllen Java Basics - Anfänger-Themen 11
P zweidimensionales Array anlegen und mit DB-Daten füllen Java Basics - Anfänger-Themen 14
W Erste Schritte füllen Attribute java Klasse in for Schleife und Array Java Basics - Anfänger-Themen 16
L Subklasse von ArrayList nur mit bestimmten Objekten füllen Java Basics - Anfänger-Themen 1
B Methoden Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 4
B Methoden 2D Arrays füllen Java Basics - Anfänger-Themen 3
C zwei dimensionales array mit "1 " füllen Java Basics - Anfänger-Themen 8
H zweidimensionales array füllen Java Basics - Anfänger-Themen 6
JG12111989 2D Array mit Array[] füllen Java Basics - Anfänger-Themen 21
J Array mit Zahlen füllen Java Basics - Anfänger-Themen 28
S JTable dynamisch mit Datenbankinhalten füllen Java Basics - Anfänger-Themen 6
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
T Progressbar füllen? Java Basics - Anfänger-Themen 3
V Methoden Matrix als 1D Array mit Werten füllen Java Basics - Anfänger-Themen 12
R ActionListener mit for Schleife füllen. Java Basics - Anfänger-Themen 4
S JComboBox automatisch füllen Java Basics - Anfänger-Themen 3
L OOP Grafik in Circle Objekt füllen Java Basics - Anfänger-Themen 3
B Array erstellen,ausgeben,mit zufallszahlen füllen aber wie ? Java Basics - Anfänger-Themen 1
B Collections ArrayList füllen - Anfängerfrage Java Basics - Anfänger-Themen 1
M OOP Liste füllen mit Strings Java Basics - Anfänger-Themen 9
S Mehrdimensionales Array füllen Java Basics - Anfänger-Themen 1
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
P Ein Array mit der Eingaber der User füllen und ausgeben Java Basics - Anfänger-Themen 6
S Textdatei einlesen und JFrame füllen Java Basics - Anfänger-Themen 14
S JTabel korrekt mit Datensätzen aus ResultSet füllen Java Basics - Anfänger-Themen 4
I String mit Nullen füllen Java Basics - Anfänger-Themen 4
C JTextField füllen Java Basics - Anfänger-Themen 5
M Kann einen Array nicht füllen, im Nachhinein nur "null"-Werte Java Basics - Anfänger-Themen 11
M char Array füllen Java Basics - Anfänger-Themen 2
X JTable mit Inhalten aus JTextField o.ä. füllen Java Basics - Anfänger-Themen 4
A List mit integern füllen Java Basics - Anfänger-Themen 4
L String array mit split füllen Java Basics - Anfänger-Themen 14
Spin Blatt mit Bildern füllen Java Basics - Anfänger-Themen 5
S externe Webseiten füllen Java Basics - Anfänger-Themen 5
1 Erste Schritte Progressbar füllen ?? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben