Subtrees hinzugefügt
This commit is contained in:
parent
155d0786a6
commit
3cc08a2004
443 changed files with 131415 additions and 0 deletions
7
Quellcodes/Alg_DS_Sudoku/.gitignore
vendored
Normal file
7
Quellcodes/Alg_DS_Sudoku/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
**/*.sh
|
||||
**/*.class
|
||||
**/*.ctxt
|
||||
repo.adoc
|
||||
repo_subtree.adoc
|
||||
/alt
|
||||
/hide
|
||||
59
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/BekannteZahl.java
Normal file
59
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/BekannteZahl.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Repräsentiert eine "sicher" eingetragene Zahl in einer Sudoku-Zelle
|
||||
* Kann eine Vorgabe sein oder eine durch Schlussfolgerungen gesetzte Zahl sein.
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class BekannteZahl implements Eintrag
|
||||
{
|
||||
/**
|
||||
* Der Wert der bekannten Zahl
|
||||
*/
|
||||
private int wert;
|
||||
|
||||
/**
|
||||
* Die Farbe, in der die Zahl gezeichnet werden soll (für Backtracking-Situationen)
|
||||
*/
|
||||
private Color farbe;
|
||||
|
||||
/**
|
||||
* Erzeugt eine neue bekannte Zahl
|
||||
* @param w Der Wert der Zahl
|
||||
*/
|
||||
public BekannteZahl(int w)
|
||||
{
|
||||
wert = w;
|
||||
farbe = Color.BLACK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Markiert die Zahl, dies bedeutet, dass sie beim Backtracking "geraten" wurde
|
||||
*/
|
||||
public void setMarkiert()
|
||||
{
|
||||
farbe = new Color(140, 70, 120);
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet die Zahl auf ein Graphics-Objekt
|
||||
* Sollte nicht direkt aufgerufen werden.
|
||||
*/
|
||||
public void zeichneDich(Graphics g, Rectangle r)
|
||||
{
|
||||
g.setColor(farbe);
|
||||
g.setFont(g.getFont().deriveFont(65.0f));
|
||||
SudokuPanel.drawCenteredString(g, ""+wert, r);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt den Zahlwert der bekannten Zahl zurück
|
||||
* @return Der Wert der Zahl
|
||||
*/
|
||||
public int getZahl()
|
||||
{
|
||||
return wert;
|
||||
}
|
||||
}
|
||||
294
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/BitSet.java
Normal file
294
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/BitSet.java
Normal file
|
|
@ -0,0 +1,294 @@
|
|||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Eine Set basierend auf Bitvektoren
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version 26.9.2020
|
||||
*/
|
||||
public class BitSet extends Set
|
||||
{
|
||||
private ArrayList<Integer> daten;
|
||||
|
||||
/**
|
||||
* Erzeugt eine neue leere Set
|
||||
*/
|
||||
public BitSet()
|
||||
{
|
||||
daten = new ArrayList<Integer>();
|
||||
}
|
||||
|
||||
protected int[] alsArray()
|
||||
{
|
||||
int[] ergebnis = new int[anzahl()];
|
||||
int index = 0;
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i))
|
||||
{
|
||||
ergebnis[index] = i;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob die Menge kein Element enthält
|
||||
* @return true, wenn die Menge leer ist; false sonst
|
||||
*/
|
||||
public boolean istLeer()
|
||||
{
|
||||
for (int v : daten)
|
||||
{
|
||||
if (v != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob ein bestimmter Wert in der Menge enthalten ist.
|
||||
* @param wert Der zu suchende Wert
|
||||
*/
|
||||
public boolean enthaelt(int x)
|
||||
{
|
||||
if (x >= 32*daten.size() || x < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
int i = x / 32;
|
||||
int j = x % 32;
|
||||
int mask = 1 << j;
|
||||
return (daten.get(i) & mask) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt die Mächtigkeit der Menge zurück
|
||||
* @return Die Anzahl der Elemente in der Menge
|
||||
*/
|
||||
public int anzahl()
|
||||
{
|
||||
int laenge = 0;
|
||||
for (int i : daten)
|
||||
{
|
||||
laenge += Integer.bitCount(i);
|
||||
}
|
||||
return laenge;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bestimmt die Differenzmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, die von dieser Menge abgezogen werden soll.
|
||||
* @return Eine neue Set, die alle Elemente dieser Menge enthält, die nicht in s enthalten sind.
|
||||
*/
|
||||
public Set differenz(Set s)
|
||||
{
|
||||
BitSet ergebnis = new BitSet();
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i) & ~(bs.daten.get(i)));
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i) && !s.enthaelt(i))
|
||||
{
|
||||
ergebnis.einfuegen(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fügt einen neuen Wert in die Menge ein, falls er nicht bereits enthalten ist.
|
||||
* @param wert Der einzufügende Wert
|
||||
*/
|
||||
public void einfuegen(int x)
|
||||
{
|
||||
if (x >= 0)
|
||||
{
|
||||
int i = x / 32;
|
||||
daten.ensureCapacity(i+1);
|
||||
while(i >= daten.size())
|
||||
{
|
||||
daten.add(0);
|
||||
}
|
||||
int j = x % 32;
|
||||
int mask = 1 << j;
|
||||
daten.set(i, daten.get(i) | mask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge eine Untermenge der Menge s ist.
|
||||
* @param s Die Menge, die geprüft werden soll.
|
||||
* @return true, wenn jedes Element dieser Menge in s enthalten ist; false sonst
|
||||
*/
|
||||
public boolean untermenge(Set s)
|
||||
{
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
int a = daten.get(i);
|
||||
int b = bs.daten.get(i);
|
||||
if ((a & ~b) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
if (daten.get(i) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i) && !s.enthaelt(i))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Bestimmt die Vereinigungsmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Vereinigungsmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Vereinigungsmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public Set vereinigungsmenge(Set s)
|
||||
{
|
||||
BitSet ergebnis = new BitSet();
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i) | bs.daten.get(i));
|
||||
}
|
||||
for (int i = daten.size(); i < bs.daten.size(); i++)
|
||||
{
|
||||
ergebnis.daten.add(bs.daten.get(i));
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int[] a = s.alsArray();
|
||||
ergebnis.daten.addAll(daten);
|
||||
for (int n : a)
|
||||
{
|
||||
ergebnis.einfuegen(n);
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bestimmt die Schnittmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Schnittmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Schnittmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public Set schnittmenge(Set s)
|
||||
{
|
||||
BitSet ergebnis = new BitSet();
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i) & bs.daten.get(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i) && s.enthaelt(i))
|
||||
{
|
||||
ergebnis.einfuegen(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Entfernt einen Wert aus der Menge, falls er enthalten ist.
|
||||
* @param wert Der zu entfernende Wert
|
||||
*/
|
||||
public void entfernen(int x)
|
||||
{
|
||||
if (x < 32*daten.size() && x >= 0)
|
||||
{
|
||||
int i = x / 32;
|
||||
int j = x % 32;
|
||||
int mask = ~(1 << j);
|
||||
daten.set(i, daten.get(i) & mask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge und s die gleichen Elemente enthalten
|
||||
* @param s Die zu überprüfende Menge
|
||||
* @return true, wenn beide Mengen die gleichen Elemente enthalten; false sonst
|
||||
*/
|
||||
public boolean gleich(Set s)
|
||||
{
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
if (daten.get(i) != bs.daten.get(i))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = daten.size(); i < bs.daten.size(); i++)
|
||||
{
|
||||
if (bs.daten.get(i) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
if (daten.get(i) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return super.gleich(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
16
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/Eintrag.java
Normal file
16
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/Eintrag.java
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Ein Eintrag in einer Sudoku-Zelle, kann entweder eine feststehende Zahl sein oder eine Menge von Kandidaten
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public interface Eintrag
|
||||
{
|
||||
/**
|
||||
* Zeichnet den Eintrag auf ein Graphics-Objekt
|
||||
* Sollte nicht direkt aufgerufen werden.
|
||||
*/
|
||||
void zeichneDich(Graphics g, Rectangle ziel);
|
||||
}
|
||||
56
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/Kandidatenmenge.java
Normal file
56
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/Kandidatenmenge.java
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Repräsentiert eine Kandidatenmenge für eine Sudoku-Zelle
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class Kandidatenmenge extends BitSet implements Eintrag
|
||||
{
|
||||
/**
|
||||
* Erzeugt eine neue Kandidatenmenge bestehend aus den Zahlen von 1 bis 9
|
||||
*/
|
||||
public Kandidatenmenge()
|
||||
{
|
||||
for (int i = 1; i <= 9; i++)
|
||||
{
|
||||
this.einfuegen(i);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet die Kandidatenmenge auf ein Graphics-Objekt
|
||||
* Sollte nicht direkt aufgerufen werden.
|
||||
*/
|
||||
public void zeichneDich(Graphics g, Rectangle r)
|
||||
{
|
||||
if (istLeer())
|
||||
{
|
||||
g.setColor(Color.RED);
|
||||
((Graphics2D)g).setStroke(new BasicStroke(3));
|
||||
g.drawLine(r.x,r.y,r.x+r.width, r.y+r.height);
|
||||
g.drawLine(r.x,r.y+r.height,r.x+r.width, r.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
g.setColor(Color.BLUE);
|
||||
g.setFont(g.getFont().deriveFont(20.0f));
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
for (int j = 0; j < 3; j++)
|
||||
{
|
||||
int n = 3*j+i+1;
|
||||
if (enthaelt(n))
|
||||
{
|
||||
int x = (int)(r.getX()+i*r.getWidth()/3);
|
||||
int y = (int)(r.getY()+j*r.getHeight()/3);
|
||||
int w = (int)(r.getWidth()/3);
|
||||
int h = (int)(r.getHeight()/3);
|
||||
SudokuPanel.drawCenteredString(g, ""+n, x, y, w, h);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
5
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/README.TXT
Normal file
5
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/README.TXT
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
PROJEKTBEZEICHNUNG: Sudoku
|
||||
PROJEKTZWECK: Implementieren Sie einen Teil eines Sudoku-Löser
|
||||
VERSION oder DATUM: Dezember 2020
|
||||
WIE IST DAS PROJEKT ZU STARTEN: Erzeugen Sie ein neues Objekt vom Typ SudokuGitter, entweder ohne Parameter oder mit einem int-Parameter (von 0 bis 399)
|
||||
AUTOR(EN): Rainer Helfrich, ZPG Informatik
|
||||
107
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/Set.java
Normal file
107
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/Set.java
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/**
|
||||
* Schnittstelle des ADTs Set
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version 26.9.2020
|
||||
*/
|
||||
|
||||
public abstract class Set
|
||||
{
|
||||
/**
|
||||
* Fügt einen neuen Wert in die Menge ein, falls er nicht bereits enthalten ist.
|
||||
* @param wert Der einzufügende Wert
|
||||
*/
|
||||
public abstract void einfuegen(int wert);
|
||||
|
||||
/**
|
||||
* Entfernt einen Wert aus der Menge, falls er enthalten ist.
|
||||
* @param wert Der zu entfernende Wert
|
||||
*/
|
||||
public abstract void entfernen(int wert);
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob ein bestimmter Wert in der Menge enthalten ist.
|
||||
* @param wert Der zu suchende Wert
|
||||
*/
|
||||
public abstract boolean enthaelt(int wert);
|
||||
|
||||
/**
|
||||
* Bestimmt die Schnittmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Schnittmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Schnittmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public abstract Set schnittmenge(Set s);
|
||||
|
||||
/**
|
||||
* Bestimmt die Vereinigungsmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Vereinigungsmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Vereinigungsmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public abstract Set vereinigungsmenge(Set s);
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge eine Untermenge der Menge s ist.
|
||||
* @param s Die Menge, die geprüft werden soll.
|
||||
* @return true, wenn jedes Element dieser Menge in s enthalten ist; false sonst
|
||||
*/
|
||||
public abstract boolean untermenge(Set s);
|
||||
|
||||
/**
|
||||
* Bestimmt die Differenzmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, die von dieser Menge abgezogen werden soll.
|
||||
* @return Eine neue Set, die alle Elemente dieser Menge enthält, die nicht in s enthalten sind.
|
||||
*/
|
||||
public abstract Set differenz(Set s);
|
||||
|
||||
/**
|
||||
* Gibt die Mächtigkeit der Menge zurück
|
||||
* @return Die Anzahl der Elemente in der Menge
|
||||
*/
|
||||
public abstract int anzahl();
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob die Menge kein Element enthält
|
||||
* @return true, wenn die Menge leer ist; false sonst
|
||||
*/
|
||||
public abstract boolean istLeer();
|
||||
|
||||
protected abstract int[] alsArray();
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge und s die gleichen Elemente enthalten
|
||||
* @param s Die zu überprüfende Menge
|
||||
* @return true, wenn beide Mengen die gleichen Elemente enthalten; false sonst
|
||||
*/
|
||||
public boolean gleich(Set s)
|
||||
{
|
||||
return untermenge(s) && s.untermenge(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt die String-Darstellung der Menge (aufzählende Darstellung) zurück
|
||||
* @return Ein String, der alle Elemente der Menge aufzählt.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
if (istLeer())
|
||||
{
|
||||
return "{ }";
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(int v : alsArray())
|
||||
{
|
||||
if (sb.length() == 0)
|
||||
{
|
||||
sb.append("{ ");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(", ");
|
||||
}
|
||||
sb.append(v);
|
||||
}
|
||||
sb.append(" }");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
194
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuFrame.java
Normal file
194
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuFrame.java
Normal file
|
|
@ -0,0 +1,194 @@
|
|||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
*
|
||||
* Ein Fenster, um das Sudoku-Spiel darzustellen
|
||||
* Hier sollte nichts verändert werden.
|
||||
* @version Dezember 2020
|
||||
* @author Rainer Helfrich
|
||||
*/
|
||||
|
||||
public class SudokuFrame extends JFrame {
|
||||
|
||||
Point backtrackingPosition;
|
||||
int nextBacktrackIndex;
|
||||
JButton btnBacktrack;
|
||||
SudokuGitter dasSpiel;
|
||||
JLabel lblSackgasse;
|
||||
|
||||
public SudokuFrame(SudokuGitter sp, SudokuFrame parent) {
|
||||
|
||||
super();
|
||||
backtrackingPosition = null;
|
||||
dasSpiel = sp;
|
||||
nextBacktrackIndex = -1;
|
||||
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||
int frameWidth = 800;
|
||||
int frameHeight = 900;
|
||||
setSize(frameWidth, frameHeight);
|
||||
|
||||
if (parent != null)
|
||||
{
|
||||
parent.setEnabled(false);
|
||||
setLocation(parent.getX() + 20, parent.getY() + 20);
|
||||
}
|
||||
else
|
||||
{
|
||||
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
int x = (d.width - getSize().width) / 2;
|
||||
int y = (d.height - getSize().height) / 2;
|
||||
setLocation(x, y);
|
||||
}
|
||||
setTitle("Sudokus lösen");
|
||||
setResizable(false);
|
||||
Container cp = getContentPane();
|
||||
cp.setLayout(null);
|
||||
|
||||
SudokuPanel sudokuPanel1 = new SudokuPanel(sp);
|
||||
sudokuPanel1.setBounds(8, 8, 720, 720);
|
||||
cp.add(sudokuPanel1);
|
||||
|
||||
final JLabel lblGewonnen = new JLabel("Spiel gelöst");
|
||||
lblGewonnen.setBounds(220, 770, 400, 16);
|
||||
lblGewonnen.hide();
|
||||
cp.add(lblGewonnen);
|
||||
|
||||
lblSackgasse = new JLabel("Spiel so nicht lösbar -> Backtracking nötig");
|
||||
lblSackgasse.setBounds(220, 770, 400, 16);
|
||||
lblSackgasse.setForeground(Color.RED);
|
||||
lblSackgasse.hide();
|
||||
cp.add(lblSackgasse);
|
||||
|
||||
final JButton btnKandidatenListe = new JButton("Kandidatenmengen erstellen");
|
||||
final JButton btnEintrag = new JButton("Eintragen");
|
||||
final JButton btnAutomatisch = new JButton("Automatisch");
|
||||
btnAutomatisch.setBounds(8, 770, 200, 24);
|
||||
btnEintrag.setEnabled(false);
|
||||
btnBacktrack = new JButton("Backtracking-Schritt");
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnKandidatenListe.setBounds(8, 740, 200, 24);
|
||||
|
||||
AtomicBoolean bEintragungMoeglich = new AtomicBoolean(false);
|
||||
ActionListener alKandidaten = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
bEintragungMoeglich.set(sp.kandidatenMengenErstellen());
|
||||
if (bEintragungMoeglich.get())
|
||||
{
|
||||
btnEintrag.setEnabled(true);
|
||||
}
|
||||
else // Fehler -> Zurückgehen
|
||||
{
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnAutomatisch.setEnabled(false);
|
||||
lblSackgasse.show();
|
||||
}
|
||||
btnKandidatenListe.setEnabled(false);
|
||||
sudokuPanel1.repaint();
|
||||
}
|
||||
};
|
||||
ActionListener alEintrag = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
bEintragungMoeglich.set(sp.eintragen());
|
||||
if (bEintragungMoeglich.get()) // es war eine Eintragung möglich
|
||||
{
|
||||
btnKandidatenListe.setEnabled(true);
|
||||
}
|
||||
else // Man muss raten -> Backtracking
|
||||
{
|
||||
btnBacktrack.setEnabled(true);
|
||||
btnAutomatisch.setEnabled(false);
|
||||
backtrackingPosition = sp.getPositionVonKleinsterKandidatenmenge();
|
||||
if (backtrackingPosition == null)
|
||||
{
|
||||
if (sp.istGeloest())
|
||||
{
|
||||
lblGewonnen.show();
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnEintrag.setEnabled(false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Kandidatenmenge km = (Kandidatenmenge)sp.getEintrag(backtrackingPosition.x, backtrackingPosition.y);
|
||||
nextBacktrackIndex = 0;
|
||||
btnBacktrack.setText("Backtracking-Schritt 1 von " + km.anzahl());
|
||||
}
|
||||
btnEintrag.setEnabled(false);
|
||||
sudokuPanel1.repaint();
|
||||
}
|
||||
};
|
||||
|
||||
btnKandidatenListe.addActionListener(alKandidaten);
|
||||
cp.add(btnKandidatenListe);
|
||||
cp.add(btnAutomatisch);
|
||||
|
||||
btnEintrag.setBounds(220, 740, 200, 24);
|
||||
btnEintrag.addActionListener(alEintrag);
|
||||
cp.add(btnEintrag);
|
||||
|
||||
btnAutomatisch.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
if (btnEintrag.isEnabled())
|
||||
{
|
||||
alEintrag.actionPerformed(null);
|
||||
}
|
||||
while(true)
|
||||
{
|
||||
alKandidaten.actionPerformed(null);
|
||||
if (!bEintragungMoeglich.get())
|
||||
{
|
||||
break;
|
||||
}
|
||||
alEintrag.actionPerformed(null);
|
||||
if (!bEintragungMoeglich.get())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
btnBacktrack.setBounds(220+212, 740, 200, 24);
|
||||
btnBacktrack.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
int versuch = ((Kandidatenmenge)sp.getEintrag(backtrackingPosition.x, backtrackingPosition.y)).alsArray()[nextBacktrackIndex];
|
||||
SudokuGitter spNeu = sp.klonErzeugen(backtrackingPosition.x, backtrackingPosition.y, versuch);
|
||||
}
|
||||
});
|
||||
cp.add(btnBacktrack);
|
||||
|
||||
addWindowListener(new WindowAdapter(){
|
||||
public void windowClosing(WindowEvent e){
|
||||
if (parent != null)
|
||||
{
|
||||
parent.setEnabled(true);
|
||||
parent.nextBacktrackStep();
|
||||
}
|
||||
}
|
||||
});
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
private void nextBacktrackStep()
|
||||
{
|
||||
if (this.backtrackingPosition != null)
|
||||
{
|
||||
Kandidatenmenge km = (Kandidatenmenge)dasSpiel.getEintrag(backtrackingPosition.x, backtrackingPosition.y);
|
||||
nextBacktrackIndex++;
|
||||
if (nextBacktrackIndex >= km.anzahl())
|
||||
{
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnBacktrack.setText("Backtracking-Schritt");
|
||||
lblSackgasse.show();
|
||||
}
|
||||
else
|
||||
{
|
||||
btnBacktrack.setText("Backtracking-Schritt "+(nextBacktrackIndex+1)+" von " + km.anzahl());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
327
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuGitter.java
Normal file
327
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuGitter.java
Normal file
|
|
@ -0,0 +1,327 @@
|
|||
import java.util.ArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.awt.Point;
|
||||
|
||||
/**
|
||||
* Repräsentiert ein 9x9-Sudoku-Gitter
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class SudokuGitter
|
||||
{
|
||||
/**
|
||||
* Die einzelnen Felder des Gitters
|
||||
* Erster Index = x-Koordinate
|
||||
* Zweiter Index = y-Koordinate
|
||||
*/
|
||||
private Eintrag[][] felder;
|
||||
|
||||
/**
|
||||
* Verweist auf das Fenster, in dem das Gitter dargestellt wird
|
||||
*/
|
||||
private SudokuFrame theFrame;
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit dem Rätsel Nr. 100
|
||||
*/
|
||||
public SudokuGitter()
|
||||
{
|
||||
this(100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit dem Rätsel Nr. 100
|
||||
* @param nummer Die Nummer des Spiels
|
||||
*/
|
||||
public SudokuGitter(int nummer)
|
||||
{
|
||||
this(SudokuRaetselDB.getRaetsel(nummer));
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit durch den String beschriebenen Spiel
|
||||
* @param spiel Eine String-Codierung des Spiels
|
||||
*/
|
||||
public SudokuGitter(String spiel)
|
||||
{
|
||||
this(spiel, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter als Kopie eines anderen Gitters
|
||||
* @param vorlage Die Vorlage für das neue Gitter
|
||||
*/
|
||||
private SudokuGitter(SudokuGitter vorlage)
|
||||
{
|
||||
this(vorlage.toString(), vorlage.theFrame);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit durch den String beschriebenen Spiel
|
||||
* @param spiel Eine String-Codierung des Spiels
|
||||
* @param parent Das übergeordnete Fenster des neu erzeugten Fensters (kann auch null sein)
|
||||
*/
|
||||
private SudokuGitter(String spiel, SudokuFrame parent)
|
||||
{
|
||||
felder = new Eintrag[9][9];
|
||||
char[] cSpiel = spiel.toCharArray();
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (cSpiel[9*j+i] != '.')
|
||||
{
|
||||
felder[i][j] = new BekannteZahl(Integer.parseInt(""+cSpiel[9*j+i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
theFrame = new SudokuFrame(this, parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt einen Klon des aktuellen Gitters und setzt eine Zelle auf einen bestimmten Wert
|
||||
* @param x Die x-Koordinate des zu setzenden Feldes
|
||||
* @param y Die y-Koordinate des zu setzenden Feldes
|
||||
* @param wert Der zu setzende Wert
|
||||
* @return Die Kopie des Gitters
|
||||
*/
|
||||
public SudokuGitter klonErzeugen(int x, int y, int wert)
|
||||
{
|
||||
SudokuGitter sp = new SudokuGitter(this);
|
||||
BekannteZahl raten = new BekannteZahl(wert);
|
||||
raten.setMarkiert();
|
||||
sp.felder[x][y] = raten;
|
||||
sp.theFrame.setTitle("Sudokus lösen: Versuch (" + x + "," + y + ") <- " + wert);
|
||||
return sp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wandelt das Gitter in seine String-Darstellung um
|
||||
* @return Eine String-Darstellung des Gitters
|
||||
*/
|
||||
public String toString()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int y = 0; y < 9; y++)
|
||||
{
|
||||
for (int x = 0; x < 9; x++)
|
||||
{
|
||||
if (felder[x][y] instanceof BekannteZahl)
|
||||
{
|
||||
sb.append(""+((BekannteZahl)felder[x][y]).getZahl());
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(".");
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prüft, ob das Spiel gelöst ist
|
||||
* @return true, wenn das Spiel gelöst ist; false sonst
|
||||
*/
|
||||
public boolean istGeloest()
|
||||
{
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (!(felder[i][j] instanceof BekannteZahl))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt eine Zahl ins Gitter ein, wenn es möglich ist. Wenn ja, löscht es alle Kandidatenmengen aus dem Gitter
|
||||
* @return true, wenn eine Eintragung möglich war; false sonst
|
||||
*/
|
||||
public boolean eintragen()
|
||||
{
|
||||
boolean ergebnis = nackterEinerEintragen();
|
||||
if (!ergebnis)
|
||||
{
|
||||
ergebnis = versteckterEinerEintragen();
|
||||
}
|
||||
if (ergebnis)
|
||||
{
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (felder[i][j] instanceof Kandidatenmenge)
|
||||
{
|
||||
felder[i][j] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt den Eintrag an der gewünschten Koordinate zurück
|
||||
* @param x Die x-Koordinate des Eintrags (0 bis 8)
|
||||
* @param y Die y-Koordinate des Eintrags (0 bis 8)
|
||||
* @return Der Eintrag an der gewünschten Koordinate
|
||||
*/
|
||||
public Eintrag getEintrag(int x, int y)
|
||||
{
|
||||
return felder[x][y];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Zeile zurück
|
||||
* @param z Die Nummer der Zeile (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen der Zeile
|
||||
*/
|
||||
private Eintrag[] getZeile(int z)
|
||||
{
|
||||
return getZeile(z, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Zeile zurück, die einem Prädikat entsprechen
|
||||
* @param z Die Nummer der Zeile (0 bis 8)
|
||||
* @param pred Das Prädikat, mit dem die Einträge geprüft werden sollen; null für alle Einträge
|
||||
* @return Ein Array mit allen Einträgen der Zeile, die dem Prädikat entsprechen
|
||||
*/
|
||||
private Eintrag[] getZeile(int z, Predicate<Eintrag> pred)
|
||||
{
|
||||
ArrayList<Eintrag> a = new ArrayList<Eintrag>();
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
if (pred == null || pred.test(felder[i][z]))
|
||||
a.add(felder[i][z]);
|
||||
}
|
||||
return a.toArray(new Eintrag[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Spalte zurück
|
||||
* @param s Die Nummer der Spalte (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen der Spalte
|
||||
*/
|
||||
private Eintrag[] getSpalte(int s)
|
||||
{
|
||||
return getSpalte(s, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Spalte zurück, die einem Prädikat entsprechen
|
||||
* @param s Die Nummer der Spalte (0 bis 8)
|
||||
* @param pred Das Prädikat, mit dem die Einträge geprüft werden sollen; null für alle Einträge
|
||||
* @return Ein Array mit allen Einträgen der Spalte, die dem Prädikat entsprechen
|
||||
*/
|
||||
private Eintrag[] getSpalte(int s, Predicate<Eintrag> pred)
|
||||
{
|
||||
ArrayList<Eintrag> a = new ArrayList<Eintrag>();
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
if (pred == null || pred.test(felder[s][i]))
|
||||
a.add(felder[s][i]);
|
||||
}
|
||||
return a.toArray(new Eintrag[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge des Blocks zurück, in dem die Zelle (x,y) liegt
|
||||
* @param x Die x-Koordinate der Zelle (0 bis 8)
|
||||
* @param y Die y-Koordinate der Zelle (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen des Blocks
|
||||
*/
|
||||
private Eintrag[] getBlockVon(int x, int y)
|
||||
{
|
||||
return getBlockVon(x, y, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge des Blocks zurück, in dem die Zelle (x,y) liegt, sonfern diese einem Prädikat entsprechen
|
||||
* @param x Die x-Koordinate der Zelle (0 bis 8)
|
||||
* @param y Die y-Koordinate der Zelle (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen des Blocks, die dem Prädikat entsprechen
|
||||
*/
|
||||
private Eintrag[] getBlockVon(int x, int y, Predicate<Eintrag> pred)
|
||||
{
|
||||
ArrayList<Eintrag> a = new ArrayList<Eintrag>();
|
||||
int xs = (x/3)*3;
|
||||
int ys = (y/3)*3;
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
for (int j = 0; j < 3; j++)
|
||||
{
|
||||
if (pred == null || pred.test(felder[xs+i][ys+j]))
|
||||
a.add(felder[xs+i][ys+j]);
|
||||
}
|
||||
}
|
||||
return a.toArray(new Eintrag[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt in allen Zellen des Gitters, an denen bisher null steht, die Kandidatenmenge ein
|
||||
* @return true, wenn alle Kandidatenmengen nichtleer sind; false sonst
|
||||
*/
|
||||
public boolean kandidatenMengenErstellen()
|
||||
{
|
||||
//# TODO: Vervollständigen Sie die Methode.
|
||||
//# Sie soll an alle Stellen im zweidimensionalen Array felder, die derzeit null enthalten, eine Kandidatenmenge setzen
|
||||
//# Falls eine der Kandidatenmengen leer ist, soll false zurückgegeben werden, andernfalls true.
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt eine Zahl nach der "Nackter Einer"-Technik ins Gitter ein.
|
||||
* @return true, wenn eine solche Eintragung möglich war; false sonst
|
||||
*/
|
||||
private boolean nackterEinerEintragen()
|
||||
{
|
||||
//# TODO: Vervollständigen Sie die Methode.
|
||||
//# Sie soll einen (!) Eintragungsschritt nach der "Nackter Einer"-Technik machen
|
||||
//# und true zurückgeben, wenn das Eintragen möglich war. Andernfalls soll false zurückgeliefert werden.
|
||||
//# Es ist wirklich wichtig, dass Sie immer nur einen Eintragungsschritt machen, da sonst falsche Ergebnisse entstehen können.
|
||||
//# Zum Eintragen erzeugen Sie ein neues Objekt vom Typ BekannteZahl mit der entsprechenden Ziffer als Parameter und
|
||||
//# tragen Sie es in das zweidimensionale Array felder ein.
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt eine Zahl nach der "Versteckter Einer"-Technik ins Gitter ein.
|
||||
* @return true, wenn eine solche Eintragung möglich war; false sonst
|
||||
*/
|
||||
private boolean versteckterEinerEintragen()
|
||||
{
|
||||
//# TODO: Vervollständigen Sie die Methode.
|
||||
//# Sie soll einen (!) Eintragungsschritt nach der "Versteckter Einer"-Technik machen
|
||||
//# und true zurückgeben, wenn das Eintragen möglich war. Andernfalls soll false zurückgeliefert werden.
|
||||
//# Es ist wirklich wichtig, dass Sie immer nur einen Eintragungsschritt machen, da sonst falsche Ergebnisse entstehen können.
|
||||
//# Zum Eintragen erzeugen Sie ein neues Objekt vom Typ BekannteZahl mit der entsprechenden Ziffer als Parameter und
|
||||
//# tragen Sie es in das zweidimensionale Array felder ein.
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sucht die kleinste Kandidatenmenge im Gitter und gibt ihre Koordinaten als Point zurück
|
||||
* @return Die Koordinaten der kleinsten Kandidatenmenge; null, wenn keine Kandidatenmenge im Gitter steht
|
||||
*/
|
||||
public Point getPositionVonKleinsterKandidatenmenge()
|
||||
{
|
||||
Point p = null;
|
||||
//# TODO: Vervollständigen Sie diese Methode.
|
||||
//# Sie gibt die Position der Kandidatenmenge zurück, die die wenigsten Werte enthält.
|
||||
//# Der x-Wert des Point-Objekts ist die erste Koordinate im zweidimensionalen Array felder, der y-Wert die zweite
|
||||
//# Beispiel zum Erzeugen eines Point: p = new Point(spalte, zeile);
|
||||
//# Falls kein Eintrag in felder eine Kandidatenmenge ist, soll null zurückgegeben werden.
|
||||
//# Dies ist der Fall, wenn das Rätsel gelöst ist.
|
||||
|
||||
return p;
|
||||
}
|
||||
}
|
||||
99
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuPanel.java
Normal file
99
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuPanel.java
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Ein Panel, in dem das Sudoku-Spiel gezeichnet wird.
|
||||
* Hier sollte nichts verändert werden.
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class SudokuPanel extends JPanel
|
||||
{
|
||||
/**
|
||||
* Das Spiel, das dargestellt werden soll
|
||||
*/
|
||||
private SudokuGitter dasSpiel;
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Panel
|
||||
* @param s Das Spiel, das dargestellt werden soll.
|
||||
*/
|
||||
public SudokuPanel(SudokuGitter s)
|
||||
{
|
||||
dasSpiel = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet das Spiel auf ein Graphics-Objekt
|
||||
* @param gg Das Graphics-Objekt, auf das gezeichnet werden soll
|
||||
*/
|
||||
public void paintComponent(Graphics gg)
|
||||
{
|
||||
Graphics2D g = (Graphics2D)gg;
|
||||
g.setColor(Color.WHITE);
|
||||
g.fillRect(0,0,getWidth(),getHeight());
|
||||
g.setColor(Color.BLACK);
|
||||
g.setStroke(new BasicStroke(5));
|
||||
int w = getWidth()-5;
|
||||
int h = getHeight()-5;
|
||||
g.drawRect(2, 2, w/3, h);
|
||||
g.drawRect(2+w/3, 2, w/3, h);
|
||||
g.drawRect(2+2*w/3, 2, getWidth()-2*w/3-5, h);
|
||||
g.drawRect(2, 2, w, h/3);
|
||||
g.drawRect(2, 2+h/3, w, h/3);
|
||||
g.drawRect(2, 2+2*w/3, w, getHeight()-2*h/3-5);
|
||||
g.setStroke(new BasicStroke(2));
|
||||
for (int i = 1; i < 9; i++) {
|
||||
g.drawLine(2+i*w/9, 2, 2+i*w/9, h);
|
||||
g.drawLine(2, 2+i*h/9, w, 2+i*h/9);
|
||||
}
|
||||
int cellWidth = w/9;
|
||||
int cellHeight = h/9;
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
int x = 2+i*w/9;
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
int y = 2+j*h/9;
|
||||
Eintrag e = dasSpiel.getEintrag(i, j);
|
||||
if (e == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Rectangle r = new Rectangle(x+5, y+5, cellWidth-10, cellHeight-10);
|
||||
e.zeichneDich(gg, r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet einen String in einem Rechteck zentriert auf ein Graphics-Objekt
|
||||
* @param g Das Graphics-Objekt, auf das gezeichnet werden soll
|
||||
* @param text Der zu zeichnende Text
|
||||
* @param rect Der Bereich, in den der Text zentriert werden soll
|
||||
*/
|
||||
public static void drawCenteredString(Graphics g, String text, Rectangle rect) {
|
||||
drawCenteredString(g, text, rect.x, rect.y, rect.width, rect.height);
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet einen String in einem Rechteck zentriert auf ein Graphics-Objekt
|
||||
* @param g Das Graphics-Objekt, auf das gezeichnet werden soll
|
||||
* @param text Der zu zeichnende Text
|
||||
* @param x x-Koordinate der linken oberen Ecke des Rechtecks
|
||||
* @param y y-Koordinate der linken oberen Ecke des Rechtecks
|
||||
* @param w Breite des Rechtecks
|
||||
* @param h Höhe des Rechtecks
|
||||
*/
|
||||
public static void drawCenteredString(Graphics g, String text, int x, int y, int w, int h) {
|
||||
// Get the FontMetrics
|
||||
FontMetrics metrics = g.getFontMetrics();
|
||||
// Determine the X coordinate for the text
|
||||
x += (w - metrics.stringWidth(text)) / 2;
|
||||
// Determine the Y coordinate for the text (note we add the ascent, as in java 2d 0 is top of the screen)
|
||||
y += ((h - metrics.getHeight()) / 2) + metrics.getAscent();
|
||||
// Draw the String
|
||||
g.drawString(text, x, y);
|
||||
}
|
||||
|
||||
}
|
||||
444
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuRaetselDB.java
Normal file
444
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/SudokuRaetselDB.java
Normal file
|
|
@ -0,0 +1,444 @@
|
|||
|
||||
/**
|
||||
* Eine "Datenbank" mit 400 Sudoku-Rätseln
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*
|
||||
* Rätsel erzeugt mit https://qqwing.com/generate.html
|
||||
*/
|
||||
public class SudokuRaetselDB
|
||||
{
|
||||
/**
|
||||
* Gibt das gewünschte Rätsel zurück
|
||||
* @param nummer Die Nummer des Rätsels
|
||||
* @return Das Rätsel als String codiert.
|
||||
*/
|
||||
public static String getRaetsel(int nummer)
|
||||
{
|
||||
if (nummer < 0 || nummer >= 400)
|
||||
{
|
||||
return ".................................................................................";
|
||||
}
|
||||
System.out.print("Rätsel Nr. " + nummer + " (");
|
||||
if (nummer < 100)
|
||||
{
|
||||
System.out.print("einfach");
|
||||
}
|
||||
else if (nummer < 200)
|
||||
{
|
||||
System.out.print("mittel");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nummer >= 300)
|
||||
System.out.print("sehr ");
|
||||
System.out.print("schwer");
|
||||
}
|
||||
System.out.println(")");
|
||||
return raetsel[nummer];
|
||||
}
|
||||
|
||||
private static String[] raetsel = {
|
||||
"..42...18..2.4....1..68..9.26...9..7...7..28..87...9.3...4.....4..........8.3..2.",
|
||||
".5.6.3......2.......3.7.....2..69.574.....8.97..54..26....2.6......8..34...9.62..",
|
||||
".642....99...5....1.54.8..624....3.........1..8.3.1452.2.....6.......8.3.....42..",
|
||||
"...3..15.....1.......7.......36...4..7.2853..8.1..76..7..52...3.2.8..4...3...6...",
|
||||
"6..21..9...85....6.4.9..82.1..4.6.5.....7.2.94.9..5.7...........8.......5.264....",
|
||||
"5...6...973.2..4.....5..3......2.6..3........8..4......5.9.8.7..2.....356.7...9.8",
|
||||
".9....45.......3...5..3.127..849..7..29.538...7.2...9..8....74...........43..591.",
|
||||
"1......4.8.7..2.1.2.......9..9..43..3.8...7.4..286...........7173..9.48......69..",
|
||||
"...693..2..4...........13......8.9......4..37...1.98..4.1...69.37......1...2.6...",
|
||||
".8.....4........6...931....8.649..237.........4..3..174...61.9..92....3...7......",
|
||||
"...6.8.....59.4.3..9.2.....5.7........672...5.4...3..2.......4.862......9....53..",
|
||||
"..9..6.4....4...2.5......7......7.....5......76...9.....1.5.3..3.462.5..9...741..",
|
||||
"...2.....9..71....1............8.2.78..9....37.91....5.8..7.43......45.84...5.1.2",
|
||||
".93..518..2.....34..51....7.7...3......981.....927......249..........8....1..29..",
|
||||
"8.....2..2.9.7..38.....1.7......6......3.2.41.8479.3..31....78..........76.......",
|
||||
"..47.....56...917..1.6.54.8.5..367.4..3..851.....7........4............9......85.",
|
||||
"6....34.......539........6...6.......35.4982...968..7..435....9.2.....4.......2..",
|
||||
"...6.1.3..2.9.....85..27.6....8......3..5....5...6.......3.9.7.9.1.....6.7..1..59",
|
||||
"..........8....1.49.1..7.2.......872....4..1.........3..85...3.7...91..5.5.42...8",
|
||||
".........7.....6....5.....8..9.283.717.69.....2.3..1.....8...1.5.6..18.3..8...7.2",
|
||||
"3..91....4....59..1...2.......486...8...5.2........1...5.2...98.6..4.....1.6.9.4.",
|
||||
".37....1...............54...1.2.8..4.9..13.7.7.5.....14..............29835...97..",
|
||||
".1.9..8..5..1....286......3...3.8..7..5.26......5........6......87..2.9...9....56",
|
||||
"...6952.7...4..3.8........5...9.3.5.....7...29...5...65....28.473..64...8........",
|
||||
"5.......123.9.6.....9..53.44.5..3..7.1.6.9..576..4..133.....1........7....7.....6",
|
||||
"..........8...9....9...1..26..4..89532..95.6...........14....8.96..2..1.......2.3",
|
||||
".78.41.5.4........9.15...48...3..5...42..7...8..95.71.137.....9......3...........",
|
||||
"4.568.1..........6..831...9........33...5.8.2......95...1.3..25.2....3..8.4.6....",
|
||||
"...5.7.1..7......2...9.......18..6..98.65.1..5.6.......3...2..7...13..8......8.9.",
|
||||
"7.26....4.3...4....16......1....24..2.98167....3.9.....2....9.6.91.3.........7.1.",
|
||||
"9.3....71....65..2..........1..........82..9.......5.6.3....1.7..92....32.7...86.",
|
||||
".2...896......9.5718..........29.6...6....24..4.....18........4..6...1..57.....2.",
|
||||
"...7..4.5.......934....167....2.3.......1....562.9.....3..6791.2..13.........5...",
|
||||
"149.2....3.8..............196...2.......4.76...2....84....74893.8..6..1...3......",
|
||||
"2.157....56..8.....8...1...............246....16..7.4...8.2.6....746312...27....4",
|
||||
"648.....79.73....5.5....18.3......6..65...734..4.......7..8..16........8..9..45..",
|
||||
".......4..7..39.....9..7..5..3...4...1.....28..4.....1.589.....2..7.41...3..1.8.9",
|
||||
"9..........47...........9.31..98.......2.......5..1.74...87.4..3..1.25..257.3..1.",
|
||||
"8..9...7..64...39.....542.8....6.......3.8.5..7..4......7..246...387....5....3...",
|
||||
"8..5..7...9.........3.81.2...5.........162......7..6.2........1...92.58.9..6.3.7.",
|
||||
"4..6.2............5.379.4...2...6.8375...8.6..3.4.....9.7.436.....9.......6.2....",
|
||||
"....6....8.....9.4.............3......7..438.4..6.8..5..6..14.95..8..13..193..87.",
|
||||
"....4.3..6.4.9..7..237....956....72...2......1....5.64.5.......9....3....3.....12",
|
||||
".............6.......79...2..4.....57.2.85...5....918.2...479.1.57......19.8...64",
|
||||
"7..48.3.92...69......7...8..9.6..24.......9..5....36...5...........9.4......32.7.",
|
||||
"..6.....2425...1.6.....3.5..13.9...4......38..4....2.9..8.......64.8....39...26..",
|
||||
"..3..29..19.46..7.2..7.8..3..8.7...........3292....71........4..1...9...34.......",
|
||||
"..7.4.....1...3...93.812....9...748...832.1.9.2..........9..........18..3815.4...",
|
||||
"87..3.4...........1.29..7.8...21...4.19.87............3....5.9.9.73.....481.7....",
|
||||
"........1.....19.58.........6..8....5...7..23.7.39.8..9...3.6....1625.3...2..9...",
|
||||
"...6..1.9.....3.6.2....13.5..3.4.29....8.56.........5.4.9.3...2.2.....81....9....",
|
||||
"3.....1...5..7...26...159.77.46........4..53..29..3.6....2....5....9......1......",
|
||||
"4...8.6.297..2..5.8.3........4....7...8.7.2.4..7..5..9......5...5.3...4.......827",
|
||||
"5...9..18...3..4........35.....6.2.3........7....53.9.41.82....3....9.2..795.1.4.",
|
||||
"............4...89.......6...4.5.81...5.9.6.3..7.61..534.5......6.91.4..8.9.....7",
|
||||
"...4.7.....45..937.56..9.......9..65..9..8..38..756.2.......7.....3.4.....2....5.",
|
||||
"....5.89..3..6.7.15.7.....6.2.9.....7..8...........2...62.8...7..5..73629..3...8.",
|
||||
".7.....9.2.9.34.85...7.8..24..2.........57...7..8.96.......5.3........7..4..2..5.",
|
||||
".89.....3..475...1....38..4..5.....8...38..1.....42....17.2....43.517...5.2..4...",
|
||||
"......59..68..41..4.1..2...5.2.....3..3..94.21......8.3...158..6......3..8.....5.",
|
||||
"...6.7....9.....5..7...198.76...45.9...275...............8........1.67...81.52.94",
|
||||
"..2......6..4....1.31.9....7..2.4....59.37.............7...2..62.3.6.....9.15.3..",
|
||||
".....3..1...98.....7..268...283...14.....496..61...7.2....78......6..2.3......6..",
|
||||
"....8.......2.6.8.7..31.6..4....821..3.....7.21.67384.84.1...6.396..2............",
|
||||
".1...5......36..54....419.......8..36.5.9481.......67.....76435.4.18.7...........",
|
||||
"........4.2..3.51.....2...3......18...29..7.5....8...9.8..1....1.4..789.39...845.",
|
||||
"..5..693..3.24..5.6.97.......6...3.................4...4.6.5...37...26.....3..8.2",
|
||||
"............3..1........3.78....25.63...6..2...248573..4..2.8..6...574....1..3..2",
|
||||
"83.6.1.....2.....1..5.23....1.8......68....1......7..5.5.7........43....27..86.3.",
|
||||
".76..53.......27....2....89...21..6........5......7....3..5....15....93.6..89.2..",
|
||||
"76..9...3......2.....587.1....2.....9.....1.....3...9....73..86.3...69.......85.2",
|
||||
"..9...8..18.5...73.36....9...3...5...5.....6.61.....823...186.7.75.29............",
|
||||
".3.6...2...5.2..7..2..376..4.....1..8.1....67...4.6.58........1.....3.45..7..8.3.",
|
||||
"......4.5.29..............6..8.6..9.....5..78.9.23.56...4.8....25...7..3.37.2..4.",
|
||||
"19.........83.1.....58...........4.6.12.46.58.3.....9..6...413....95......3.....5",
|
||||
".4.............5....1..3..44.8..67.1.59....3.......8651..6......9675.3.......4..7",
|
||||
"4..2865..2...37.9.....5...3...7.........2....7...9....82..7...69.6....3.5.3.6948.",
|
||||
".7.....6.......3.53..8.4....1.......7....8523..6..2..4.6.3.....5..7......341..7..",
|
||||
".3...7..15.42..9.8.2.58.......7.9.2.......195....4...7.5.81..32........9.......7.",
|
||||
"96.4...13....968..5..8..9.4..4..3..6....6..7....5.4.......51..........57...6.93.8",
|
||||
"62...8.3..9........1....5..3...9......4.....6...8.2.....953..848..9..31...64...2.",
|
||||
"74...9...95.3.6.2....4.8..5......39.8......67..2...4..3...9.7.8.........5.....239",
|
||||
"...91.2..1.63....43...7.5....3..2.9..5..4967.4.7....2.......3...........64....1..",
|
||||
".7...4..232..564.11..2...7................6..46.....3...81....5......2..2.64.37..",
|
||||
"8..5.......3..1...59176....1..23.......9.58.79.76......3.8.2..6..6.7....2...5.9..",
|
||||
"4...28.7...6..7..587.94...1...21.7......7.9.6..15...4.9...5...4.........5....9...",
|
||||
"......9....57....8..69.35.73.2.48..6..4....9..8..3...42.9.........5.....8......29",
|
||||
"......8...5.49...2.8.35.1.4.....9.7...217..........5....1........8..429...9..3..8",
|
||||
".2.......7.6.9....9....2.4...3...129.......36......7...417..2.5..74...9.23.....6.",
|
||||
"..9.........2.14.8.........6.......3.85.63.....1.45.9......93...23..4....6.8..1.4",
|
||||
"6.......4...18...598...4....5..7....8.495.1.7..6..8..25.1....26..7......24...7...",
|
||||
"...5....9..1..2....4.8..56.......4......7.81...4.1.....5...69.82....46..81.7....2",
|
||||
"9.2.7..58...2....1.81..9.23....1.........7.....4...13..49.81....385.....2.7..4..5",
|
||||
".4......52...........5...2938...6....5672..8.9..4.....4....38.....9....6..7.6.2..",
|
||||
".....3......18.3..4...79..8.73....4..18.27.........5...............4.1...415.893.",
|
||||
"18..576.465....7....7...5..53...1...4....8.93.....3....741....8......9.186.....7.",
|
||||
"....9...2..4.......2...6...3.1.64.7..82...1..4....29.3.7.......1.34....6..9831...",
|
||||
"..5..6.3....1...98..1..976........598.....2..62..7....2.......1.7..3.......6...23",
|
||||
"....78.9..9.1...4.1.8...6....26.........5.781.......5..4...68.....21.5..........9",
|
||||
"....7...9....42..7..6..5...5.27...1..6...14...4.9.68.5.51..9...9.8.2.............",
|
||||
"..594...78...534..6.2....5.7......464.6...329.3...........9....974...6.8..3...2.4",
|
||||
"2....9.6.5..........1...3.534..5.....1.73..9.7.5.26.........75..9....1.3.......49",
|
||||
"..8.5.9..75.......4.....23.91..7.8.2...........5482.....1..3...8..52......3891...",
|
||||
"7.56.......1........4.2.1.3...46..2.6....8.7..1..3.4......72...8...1...2........4",
|
||||
"...32...7....8......5...213....47......9..1.5.71...89..42.3.......5..7.........21",
|
||||
"...2..5.....18...........1..1.7.2..95...3...6..7.9.18.8....7...7..92..6.65.....32",
|
||||
"5........8.......7....79....9.......4.7.28..62..9.73....85...64.2..6.....4578.2.9",
|
||||
"......8...9.3.....8.....4....37...2....9.2.1...9....7..3.2.59..7..13.....5.48...3",
|
||||
".9....2.5....9....1.......4.4.6.2.....71.4.6.8..9..1..2.....597....7..1.5.....4..",
|
||||
".1..78.4.85..2.7....65....1.......979.7.412...61........2.....8.....9......75....",
|
||||
"7..41....2.........3...9....2.......34.76.2..6.7.95..39....3.2..6.12..4......61..",
|
||||
"........75.....12..7..41..8....6..1.....728.4......75...76.....1.5..3.6..6.4....5",
|
||||
"4....6...9....4..3..1..79.8.63.7.....9.3.871.......5....7.........59..........85.",
|
||||
"9...7..4..42.163..3.6.9..2...3.215................47....5........736..9.......17.",
|
||||
"..6...7.448........975.4..8..3......71.......6.....9.18.1..5.97....3.5...4.7...1.",
|
||||
"...2.6...9.....2347..........8.35....3..7..59.......4.34........9.6..37..56.....2",
|
||||
"54.....9..219....68..312....8.6..51.2.6.....9..4.5..3.9...6.....3....8..........5",
|
||||
"..9.5...21.543.....239.....3.1.....5.......8....81..9...4.....6...6..23..6...8..4",
|
||||
".9......4.1...6....68739.2..3..2..........5...2.....1...324..8..7...1.3...26.....",
|
||||
".7..6...3.684....2.....8....2..93....3...75....9....8..876.9..........5.2.......4",
|
||||
".......9..9........3..15..6.126..58.6..1..........9.3........592...38...58.7...2.",
|
||||
"2....8.67.3.217....8....3........7..5.....8.....5.4....4...3....2.6.158.7..8....1",
|
||||
"1..4.......69.23...........2.4..571..79..14.6........24.7.5.19........35.5......4",
|
||||
"7.....8..3.4..759...2.93.6..43.6.....6...5.3.8...4..........7.55....2.......78...",
|
||||
".....6.....92.4.....3...8.4...73..589......42...9..3....6...78.8...2..9.....796.5",
|
||||
"793.....5....6.......3.1..8.3.1......57.....96.9....73......9..184.....6.76..5.8.",
|
||||
"....3........2..6....698..1.8......3..6.1.52........1.1..2...844...6...92...49.3.",
|
||||
"5..7.....86.5..4.3.......8.15.8.4...63........4..1.3..7..1...5........27......1.6",
|
||||
"1..........8....6296...3.1...9...82.6.1..9.37.3........74.........9.4..88....6.71",
|
||||
"9..5.1.2...39.....8....6..1..6.1..3..3.275.1.18..9.5.2............8...9......2..8",
|
||||
".9....8..7..3...........6.4.5.7...4...3..9...6.82.3....8.....73..6...48..3..4.5..",
|
||||
"1.7.5.....3.......5...89.3........42.8..7......25.1....94..83..8..4..........21..",
|
||||
"9......12135.2.8.......8..5.186..3....4.......2693....8....62........5.9.......6.",
|
||||
"..57...6.9....4.....2.....4.972...1.46......5.5..41........6.73.1..7952.......1..",
|
||||
".....89..4........2.9.31......3....2.....4..1.1.58..9.3.1..62...9..4..8....2.9.5.",
|
||||
"......18...6.....3..16.24.....8....5...536..8....74....1..8..7..38...561..4..3...",
|
||||
"73...1.......3...45.2..................1...4...48..51...56.2..7.1..7348...85....6",
|
||||
"..3...1..6..25..4.4..........2...........63......1.....4.62.85.5...812.37.......1",
|
||||
"6..31.5.............3......5.916.7.316........7......59.18.2.....2....98.8.7...1.",
|
||||
"...3...5..9...281...4...9.27...59...8....174.........89.2..7........3......428..3",
|
||||
"1....3..5..2...3.4.3.48..178.1......37..2..58.....64....71.2........4............",
|
||||
".3..9.5....5..3.9..29..6.8.57.8......9.....7....5.....71.....6.....6....6...1.827",
|
||||
"...1.52.8.2.4..16........4.1......2..423......3.....5...1.467....67..8...8.2.1..6",
|
||||
".....63..3.89..2.62.......4.7.4........6...35...57...2..3....5....7.8....24.....3",
|
||||
".3....5.....2....45194....8......6.2....9.....83.469......3.1......68.93...9.....",
|
||||
"8...7.....7314......16.........2......291..43..94.86.77...6..1.21........34......",
|
||||
"....9...2..............6.1.6.2..15....1..9....5.4.3.....46.279..9..3...413..4..5.",
|
||||
"..5.1..6.92..5.4.1..38..5..582..36....49.............2.......8.3.14.......6..2...",
|
||||
".......67.3...1....2.........18.7.3....1.6.8..7..3964...92...13264..3..93....8...",
|
||||
"4...63.......5.21..65..79......295.....7.1..2......4....71..62....634.........3.5",
|
||||
"16....37.5.........83...2....2..516.....3...4..1......41.3...2.......6..3562..81.",
|
||||
"..12..7.6..79......2.7.5.9.....6.54.4.5...8.26..8....1.....8...9.......4.....1.5.",
|
||||
"..29...1.....15.377...2....42........8.....7.5........9.5..4.818...5.7.4.3..71.9.",
|
||||
"1.3..4.7.....8...2.6..1..........5....4..3..6356.......82....3..7.......5...621.4",
|
||||
"38.45..1..17....9...5.8.7...4.89.......716..9.....5....3.16..............51...8.7",
|
||||
"....42.38.6.38........95..6......5.7649.......5..2.4.......67.3.........8.3..7.9.",
|
||||
"...9.2.5....38.9..5...1..6.32...............1.7.......93.5....285...1.7...1..7..8",
|
||||
"......6....5....7....296...52.93..1.......7...3..67.9...3.2.9.......5.81..168...2",
|
||||
"....9..6......3...6.5......1..2..4...9..6..1..3...5..28......51.1..5.2......34.9.",
|
||||
"2...9.....861.3..5.3........12..98....9.2....57.8.1.9.3....7....5...863........5.",
|
||||
"8.49.27...7..8..4...6...28..5.4.......753.9......7863...2..4.............4...3.9.",
|
||||
"5..1..9....8...1...9......33....1.9....6..8..1..3.56.4....685.......4.2..26.3....",
|
||||
"2.4.8..6....6......6.235....3..615.4..89....6...8..............48..9.2..5.1...3..",
|
||||
"..4.....3..35..8.....1....28....1.962.9.5..481....42..3...6.......9...1....2....5",
|
||||
"67.4..32.....8..14..1.....9.8.3.2.....4.7.....3.81......3.69.4..4.....7......3...",
|
||||
"4....1.57.3.6.....16..5...9..9....8...576.9.18......7.....95........4...7.38.....",
|
||||
"........5642.......751......8.6.1..77..2..5.8....8..1.8..35.46......2.5...47.....",
|
||||
"..79......1....2.7.....8....78..3..2.32..5..8.91...6...6..7.9.......6.1..2.8...5.",
|
||||
"4.6..8.2...5.....77..9.3.469...............5......79...32.......8.5........4..832",
|
||||
"274....9.......5.65....9...6......4.42.............18791...4..8...6....1.561.79..",
|
||||
"4.6.3..9..219.6...3..14..6.....8.......613.4.......38951.2.....8..........48.....",
|
||||
".4.21..6.2.....94..7.4.9.587.46.5...8219......5........6...7..........8.9..5.....",
|
||||
".542...3....14.....3.6....9.7.3....2.....9..46.97...5.24....9..3...1.........6..5",
|
||||
"..4......9.2.8.....6.3.78...73.....95..67.2..24.5.9......8......5..32..6329......",
|
||||
"5.8.67..16..5.19....9.2....19.6..........4...475.....6.5.........1.78..52...1....",
|
||||
".1.........7...89.29..............177..28.6.5.3..1..2..6.3.....5.89....61..8.5...",
|
||||
"..7.6258.....8..195..........32.9....8.5...3..5...6....3.......7...1..6.812......",
|
||||
"1..6....3..9..52....24..8..2..8.....58..149.........1.4.........53...4.6.9.....2.",
|
||||
".2..4.5.....5.2...........7.8...........7621.....517..5.16...9826...........97...",
|
||||
"..521....9...8.......5.4..22.1.......7.......3.47.1.9.8.7.2.3...9.1......4...9..8",
|
||||
".97.3.....8...........4...9....91.....5..2.91...3....82......7.7.35..94.8.47...5.",
|
||||
".531....4..6....9..24....6..8..35.1....2.693....48.2....564..2...9.5.............",
|
||||
"9.1..6.......5...464...97....4...5...3....6.117....32..........4596.3....63...4..",
|
||||
"..415...7.7....62.....24.8.7..9......9....5.8.5....76....6..8.2..6.......28....9.",
|
||||
"...12.3.......5....8....7.1..52.....867......3...9..5.9..3..16..7.6....9..6....3.",
|
||||
"..316..7.9....74...7.....68....75...65..8.....47.1.5.3...4.....1.....7....9......",
|
||||
".1.2.....9.3.61..5..2.....3.7..1..........4....9..5......7.6....45.936....1.5..7.",
|
||||
"8..96...5.....1.3.132...69.6...123..3.1.5...4.....95....42..1..2....8............",
|
||||
"..........437...1.561......675419.3..........4.9......79...14.6....6...81..85..7.",
|
||||
"..4.9....28...6.....6.3.....3.8....94...138...2....34.6........513...6....9.42...",
|
||||
"31................8...63...2..7.5.83.......4.13...46......5.4....3.1..72.7.8...51",
|
||||
".641.....19.37.6..3.8.......56...1..7...9.....4......7...96.4.5...5...78.8..3....",
|
||||
"9....1..4.............5...9.89.....65...28.......3..51..15.42..3...8..9.....631..",
|
||||
"....9....5..3..61.4.165......2.3.16.7.......5...1.7..9.4.5.37.2......5.....72....",
|
||||
"1.87.92....5........324.57....9.1.8.3..8.4..72.....1.....5.2.......37......4...5.",
|
||||
"..6598.........5.9...........8.6....6.19.5..8....21.3..9.1..2..23..5...6..7..2...",
|
||||
".2..13.4.3...4571....9..3.2.46.5.........2.....5..1....5...7..94..52....7.9.....3",
|
||||
"..1.......5...23..8..436......69.1.......8.96.2.1....531.8.4..9985.2.............",
|
||||
"..2...8.4...9.47....6.5793.83.....6......5..87....2....6.4....7.4.3.....3........",
|
||||
"5..8..........6..26.84127.........6.274...........81..1......5.8..354.....2...8..",
|
||||
"6..1.7....8.......1.4.68.........78..9.....2.23..7.61..4....3....9.8....81792....",
|
||||
"..2.41.9..843........5.9.....3.....7.4..7..298.....4.5...9.28..2..837.......5....",
|
||||
".....68..9....32....3.2.79..5..6..7..81.........91...6.....53.1.1........2.6...5.",
|
||||
"5......371..56....48..73...9..8..6.5..1....7.....1.9.....3.....6..1.8.4......4.5.",
|
||||
".3.........2..9......168......3.....1...2...6..6.....7...87..248...1..6..43...19.",
|
||||
"2...65..7.6.3.1..4....7.1.2.3.......4.5........2...91.926...47.3....9....71......",
|
||||
"..2...7.9375.1..2.........5..76...8.....916..2..73...........671.....29..6.2..13.",
|
||||
".....1...5.64.9..1.34.....5..7......81.7..3..3.9......7...96.58.....7....6.5.87..",
|
||||
"........9......36...5.8.2.15.2.4.....19.2..56.68..3..........2...4.5...8....1.93.",
|
||||
"...8...72....728......9..4....1.........4...7..7..816.32....6....1629..3.....1.8.",
|
||||
"...4...7.3...7...11.83....97......3.......6......6..18..1..8.93..9..4.8.6....9.5.",
|
||||
"..89.5.....24.1.5....68...4.6..3..4.8..5..1..4.1..9..8.95.............6.31.......",
|
||||
"5...23.1...3..........64.7..6....2.1.38....672..45.83....2..........5....261.7...",
|
||||
"..865..47...4.721...........629....5.4.......59.7....278..........2.95....15.....",
|
||||
"..7..26....2.....8.5.6.8.32.132.4...7..5.....58.31...........56....31...........4",
|
||||
"..9...8........7..54.7....29.786..1.8.....9...6........7415.68.65...2.74.........",
|
||||
"8.467.....7.5.8.366.59..........3..84....91.........93.1.7...89.......5...63.....",
|
||||
".91....8.....6.3.1.26.91.4.7.431.............8.....1.7...........9.7.8...4...963.",
|
||||
".6..7...4.....4..17..69.....8..2....4.79..3...3.4.6..92..1...9...12.7.....8.....3",
|
||||
".9..........5.1...1....83.6..1....5...4..3..8.6..2.1...5.4..8...4..125..6..9..2..",
|
||||
".81......23....4.....4......4....1......3..9.1.8..9..2..9....363....721..6..1.7..",
|
||||
"89...71..............95.84...4...519........6..8...4..4.5......98.1.67..67...439.",
|
||||
".....15..1.872..3....6...7...2.1.....4......5.3...81.4.87......4...7.....2..5.6..",
|
||||
"3.....61..8..6...71.6379....3.7.8........48..........224..97.8......3....9..8.43.",
|
||||
".5..3....1.7...83.6.........1.....4.463............5.7....57..2..4.2..6..7..46..3",
|
||||
"......68......23..867..32....9.............18.3....765..3..8...1.8....927..5.9...",
|
||||
".3.1.98.4..5.436...6......19..7..4.........67....38...3....1....5.3.6.9.....5....",
|
||||
".1..692.7.5.........8..76.3.8.712.......8......5..6...2.....16..9..2...8.3.......",
|
||||
"782.5....6.........5.1..3......42..75..3.761.8....5.4........7..........2.1...45.",
|
||||
"68.59....7.......89....2.54.25...........15...6..4...1...8...62....2.74...7....1.",
|
||||
"4.7....8...2...3..85.43...957.29.....2..4...7...5..2...8.....7.6..9.......4...85.",
|
||||
"..2.19.....56......6.387..26.......3..7...526.......1...325..9.7..9.8.......6....",
|
||||
"......15...9.253.6.....79..........5..7..4...2...5......3.....75..9..42..9.41..6.",
|
||||
"..61......8...7.3...4.3..758....6..........1...342...8.....8....17.63...43...5...",
|
||||
"............53...9..9..1.5..6..9521..7..265..8.............819....6...8......7.36",
|
||||
"...2...4......38....6.5.3.98.5.4793..43.......9.....27.32.....84.....59..7.......",
|
||||
".7.4.3.......62...6..71.....61.4.5....2.5.......6.14...1.52...3.3....6..74.9..2.1",
|
||||
".4....6.3.15....4.39........56.48.39....5..1...3....8......3.955.4...86..79......",
|
||||
"6......7.5....81.....7.64.......36.1..18.473....6.28.5.........254.......83..7...",
|
||||
"8.172......6.9.....2..8...7...5..7.....918.....8.4.61....1...29..7....51.9...4...",
|
||||
".687..4.......9.3.925....872.4.8..56.9..63...6...........4.....4......6.58......2",
|
||||
".5..1..342...6.58.9.....1..3..259..8...1.........839..5....23..........1...53.6..",
|
||||
"1.69........6.1..7.....4...3..5.74..4....9...879.6..1.98.....5...43........845.6.",
|
||||
".3......2..5..4..8.746.35........7.6.6.4...232...9.45.....5.....9..........2..8..",
|
||||
"....7...3.7..9..2..9....6..8.4.....9....62..1..13....7......7.29..42.186.1...8...",
|
||||
"...........7...2....8...4.62.........76.49.....432.9.8...2...6.64..1.8.9..38...42",
|
||||
".3..216.....46......9.73....1...2.........4...94...72..52..4....6....3.7..1.....4",
|
||||
"641..............78.2..4.6..579..........2...4....1...72..1.9.61...9.......4.8.15",
|
||||
".1...3...459.2...183..5...2..5....4..9....38.1..9......4...56.3...26...........54",
|
||||
"1..5..9.......8.14........56.4.........1......8..457...68.........63..9.95...137.",
|
||||
"1.37....4...4.9..1.....5...4.......2...9....7..7..3........7.5..1.3.6..992.15..73",
|
||||
"8.3...7.97.........9.....1897...6..2.3............1.572.879.5..........1.....3.8.",
|
||||
"96.32415.....9....3....1.26.......8..3...56.4.4..8..95.....8.398..53...1.......6.",
|
||||
".2..........4..7........8....78.4..1.1.92..34.5.3......392..17.8.........7...84.2",
|
||||
".5.23.......6..8....8...5.....1......39.6.....4....9...8....4.33.....62.2..45.19.",
|
||||
"..71..5....98.6..4.51..498...5.4.......5..7...4...1..3398.7...................4..",
|
||||
".7.6...38.34.2..5.1...87.2.4.7...6....3..2.8...6.4...7....368......782...........",
|
||||
"73...5.2..1...84.............3......6.....2..1.4..2.5.87.....3......1.45..67...8.",
|
||||
".2..7..5137.8.12.4.5.42....8..5...72...2.........3..4.........5.1.....3.....836.7",
|
||||
".....52172....9.5........4.59........42.........8.2......9..174..54.8.....76....8",
|
||||
"38...2...1.6.5..7.....3.8.92..1...5..1.8...62.5...6....9..2.7.............73.....",
|
||||
".......5....182..4....46..2...91....32...4.8.64.............2....83...69....91..8",
|
||||
".5.......3..765....8.2..4.15..........36........1...87...3....2..6.7.14....42.76.",
|
||||
"1..5.27.......76.94....31...4..9.....154.....2....5...69.......7...56....217..4..",
|
||||
"...5.372....84.3...31........472..8...54.........89...92.....5.....9714.......23.",
|
||||
"...6...7........1..34........85.4...1..7.3...97..614....13..86..5.....9..6..8.7..",
|
||||
"..34..8...8...6...2..7..3...4.9..6...72.4....631.....4.....8726.2.....41.........",
|
||||
"2..3.514.61..2.....3.78.........48.3.2......5...25.47.5...4....7......12......68.",
|
||||
"2.4......9.1..827.7..5..8.......7...........56...9....1.7..9.....8..4.9..6.2..1..",
|
||||
"..4...5.....48..1.1...2.7.3.48..5...2...1.35.........2............6.8...3..15.46.",
|
||||
"......3.4..9....8..4....51.72.......3......9..817.......79.84..29..34.57..52...3.",
|
||||
"7......8..3.....1..65....3.4.3..5.9.19....5...7............6...8..7.49....7.3.14.",
|
||||
"2........87..2.9...3.9........2..4..3...1..86.92..67.3..4......9274.8.6..8.......",
|
||||
".6.........9.758....1.......2.6.1.459..4..2.....85....6..5.8.....5..918.8......7.",
|
||||
"..31....278......41.9.......1.....73.46....8......2.6.2.4..6........96...3...4..7",
|
||||
"..56.....8....1...7...8.......9.85..12...5..7..7...8..2..5.619.4...........2..65.",
|
||||
".9.......7.8.3....36.9.....6..72...9...1..58....5....32...5...1.7..6..3.5...7...6",
|
||||
"23...48757.5.....2.........4..2..5..9.34.8..66......8........54.92...6..86.....9.",
|
||||
".1.........9...2.8...5.471...43....9.8....3252..............15..432.5.8..7...1...",
|
||||
".3.....9....7.....2..8....7.6.9............35..2.65......23754.....5.3..8..6...7.",
|
||||
"..51....94...5.1..2.36..4......6.....48...9........821..1.3..9..82.....46...1.2..",
|
||||
".1..52.9...536.....931...7....21.9...8.......7..6......59...6.......3...........2",
|
||||
"....8..9..74....3.9.3.......1...3........9.....987.24.4.8....1..2.51......59..723",
|
||||
"..83.4.1...2....7......18.....168....86.....3......2..69..1.4.....4.3......9...82",
|
||||
"...3.6...6.7..9.....97......7..8...2..36....99.4..78.....5...2..5.....372.8......",
|
||||
"..8....7.36......81..3.6..........34.3.1.97...85..7.....645........18.4.7........",
|
||||
".4........3...1.5.8.2.9.1..2...15.6.59.3..81.41.2....3.....4..9...953............",
|
||||
"4...583..6........89.43....1.89..6.3.....5....4..637.55.7.89.....9.......6.7.....",
|
||||
"5......2.....9..8....3........9.6.7...758......9.3.5181.5.7..9..76......8....2..1",
|
||||
"9.....2.........3......9..4..8143...4..2....52....8...5..43.....2..5..1.17.....8.",
|
||||
"6......21.41..25.3....9.7.............5..741.......63...2.3..469........3.74.6.52",
|
||||
"..8....56...25..7...3.69.1.1...9.........376..37..........1.....94.2.....5.6...8.",
|
||||
"...8.1.24.7.9346............2...6....3...27.....14..6...8....3...........92.6..48",
|
||||
".6...4.....4..368......9.3...8.1.....9...2...43....81..23..6.9.54.......6..29....",
|
||||
"..89...5.7.1..2.......7....379..4....4.3.......2.59....1.....4.2.7..83.9.3.2.7...",
|
||||
".5.6..23...98.....21..9....4.52...6....9......21.8....8.6..4..........45........1",
|
||||
".....9....5..6.4.....7.......8.4..76...93...1.9...154......4..5..159.6.4..5.7.18.",
|
||||
".........3.9.....4...796....63......18...49..95..8...14.71...3.5.....4.8...3.9...",
|
||||
"............38...17...168.99.........5.19..7.84..3......68..7......5.6..3....95..",
|
||||
"....5.......8..71.5..23.........1..9.25...8....7........392...7..1....5..8....926",
|
||||
".....2..8.3...76..8..15..2.74....8....1...23.2...75.6.1..........7.3..5..6.......",
|
||||
"6......9.....3.58.75.......3.89.4..6.7...3......17...4.9....1..5..6..7.88.6......",
|
||||
".......81.........14....2..9...21...8..7...5347..3.......5.4.3..2...9...3.5.7..1.",
|
||||
"3.4.9.....6.5...8..98..7...5....167.....345...3......8..7.8.........64....5....6.",
|
||||
".2............68...1..39.5..3..5.6.........315.......9....63.8.4..5....6..94..2..",
|
||||
"..6......53..........954.......657...98...6....781...4.......573...7........83.9.",
|
||||
"3....8.......9.....71.24..58.7.52.9.2..8.........47.2351..........9.3....8..1..4.",
|
||||
".7.......419.....76....84......9......13.482.3.26..9..836.41...1..2.6............",
|
||||
"......6...4............9852..5.3...8..4.96..13.2.5..4...6..42.9.3.....8.8.9......",
|
||||
".......6..6...2...2....5.......6....8..4.7...6.4.2.59.5.......3.8..9.4..7..84..2.",
|
||||
".........7.....9....92....4.4.13.....16..87.......7.2....9.1..86...7.2.39.43.....",
|
||||
".537.6..........59..624......9.6.84...2.....7...8.7.9......9..3.....846....65...8",
|
||||
".275........16..4.4....2..9......9.7..59...12........46..2.....5..4.9.6....7..8.5",
|
||||
".3..2..8......4...8..61..7.69..8....7.8...2...1.....38..1...9..9.6.3..4.4...72...",
|
||||
".472.....8.5.69...2..5.....3..7...4.......25...6...9...9..4.7...3.8.5..4..8.....2",
|
||||
"34...5.911984...766.5...4.8...6....59...58.....31.4.......3.......5.6...4.19.....",
|
||||
"...97.....3..1....718..4.....4.5......6..8....8.1...356..3..97..93..........8.4..",
|
||||
"..5..7.......842.7.2....4...9....6.....42....1.7..9.2.5.4.6..1...1........2.98...",
|
||||
".....6.497.....61..5.......3..9...652.....7...71......5.....1.44327.........95.3.",
|
||||
".2...4.....8.7.63.9..2....4.....9.5.......2.6...68..4...2...9.3.36.....7.....5...",
|
||||
"..........9.1....8.....65.....9.8..2.71...9.....2..6..1..7...5...8..4..676..592..",
|
||||
"..2.....7....4..81.........3.....8696....74...243..7...194...32...72.9.4.....6...",
|
||||
"3..89.627..87....3.............3..8.6...7.1..2.398...5.......6.9..62......1...9..",
|
||||
"...1..9.88..2.6..4.......6..5.......9.....72...4.2...5..5...17..92......1...54...",
|
||||
"........81..6.7.3....341.2.93.....167.193..4.8....2..3.....6.....849....4...18...",
|
||||
"...5.87...53....1......7..66.1..5..2.329.1.....8.2..5..8......3...6......2....67.",
|
||||
"8.7.6..9...2.3...6....17.8.316..87.2......9.8...2...1...5......7.......3.....6..7",
|
||||
"1.7.5..29..4......5..6.2.......7...4...1...9........57.1.54..7.4.9...8...5..2..6.",
|
||||
"...6...8....1.8.7.....32.....8.7315.1.4.2..........2..75.....4.6.2....1....715..6",
|
||||
"3.1...25...45..1..92...63....8.4....2.......1.9....6......84.2.....15.....932.4..",
|
||||
"..573...1....4.6..........96...7.4.5.....9136..........86..4...5..1.....94.3.5..8",
|
||||
"9...6........15...715.......9.1485..6...9..........8..4.6....75.2..561.9.....4..8",
|
||||
".......2.......3...2....78.87.9.4..1..1..2..8.3..5.97....4795...1...84..7.......3",
|
||||
"....6.43.....5.......1.3...4.1.7..2..37........284..7..2...68.416..8.5.3...5....2",
|
||||
"....23.7..39...5..2..49.6..46..7.9...2....3.7..8.......96..24..7........5...69...",
|
||||
"....4852......2..4..7.3....56.....4.7..95......9.....7..63.....92...67..458.7....",
|
||||
"..6..2..5......4....4..5.96.8.7...63.3..2.95...7.6..2................2.9...3.6..8",
|
||||
"....6...787.4.3..9.43...5.....3.58.4......73.....4...27..8..6..........5..267...3",
|
||||
"5...2...86........972..64..4...1.8..76.5.9.4.1.9..8..5......1.6...1...5....4..7..",
|
||||
"45.3...6.1....9..3..7.........73..4....5846.....9.6..15..61.9...7........83......",
|
||||
"..9.87.516..91.........2...3.1....9.9......758.2..51......23.....3.7.2.8........9",
|
||||
"5...3.49.8..4.56...3...9..1.....3.............5...1.32..39...6.48.6....5......8..",
|
||||
"4...25.1.7...49..2.............61.4.9...74.6...79...........9....2..73.4...23.1..",
|
||||
"...6.2.....4.5.7.22..7..8.97.2....4.3.....6...95.......69....844...9.3...8..6....",
|
||||
"..69.7.4..2.3.1...8..62.9........8...4......3.7...9..24...78.2..8....7.63........",
|
||||
"71..3..68.....6..2..3....4982.4...1....1...83...27.....41..2.....7.....438.......",
|
||||
"...4...6...23....4.9..2.1.32.7.9.....69......18...32..72........16...9....4.6...8",
|
||||
"1...4..255....9..88..31.....4...3.......8..92.7..54...4....1.....9...8.1.......57",
|
||||
".3.......5...1....91758.4...2..34...4......92..52..14....97.8..8.......5.9.3.....",
|
||||
".36...21.528....63....3.........8.9....976.....3.2...76..7....2....19.5....8...3.",
|
||||
"72...5.....1...96...3.....86.5.18.9..12.....7.......5..6.....3..971....6.....2.8.",
|
||||
"..9....8....73.........47....3.......8..1.....4..9317.....423...6.87.4.9.....6.1.",
|
||||
".8.6.....1...4....763...1............1...75.4576.9......7..4.9.....38....4.7...83",
|
||||
".6...2...5......24..2.58.....7.2....4593..7.....54.3......64.7....93.....36.....8",
|
||||
"....4.5....8.3.....53.9.4.8...76.3...17....9...58........6.397...........7..85134",
|
||||
"......8...4..2.6.9...6...3...7..31848.......3......7...2...6.....4....9.9.61.83..",
|
||||
"...86.217.3.9.........5.8....5..197..8..2.....2.3.56..5.....7........19...3..9.5.",
|
||||
".1.957...5.9864..............6.2......84952.....7..4.....5....4.41.89...7....269.",
|
||||
"..........1.3..7...3..46....58....6...9..54.11.3..7.8....4...79.967...1.4...8.6..",
|
||||
".....69......7....3.72...5......4....3.8....6...9.2.357....9....49.2.78.85.4.....",
|
||||
"64.9...7...8......93..24.8..1..7..4..9......6....4.........2..4.2..1..3...638....",
|
||||
"..47.3.5...........2.6...83........6.5.13...4...82....3...5.1..28.3..4.7.71.....2",
|
||||
".897....651..68.3...2...8....3.1..62.2...57.....37..8....28........36...6..5.1...",
|
||||
"5....2..........2..6...7..1......25...7.3...4.5.2843.....56.83...1..3..7....4.1..",
|
||||
"16.......2.8.6.......8...4...4.3.85..3..5...2...41...3.5.1.....672.........5...8.",
|
||||
".4...9.7.......4233.7......5..8.....9..5.6.872...4.3...95...8.26.........8.4...96",
|
||||
"8....2.16..6...3...4.....8..3.......9.2.....8..5..9..32.3.8.1.....5...6.51....9..",
|
||||
"79..4.1..8.3.7..466.453.9......5......6...8......9.753......58......4......78.69.",
|
||||
".....6.4..4.72........35..2....8.29.....72..85..6...3...9...87.6...57..4...3..9.6",
|
||||
".1....6.4.....1...3.84.......1..2.594.3..5..25...6....6..8.9......253.4.....14.9.",
|
||||
"....2.75....8.1.6.5..6.........781.......6.2..2.....3...7.....43.6...87......4..5",
|
||||
"71........29......5.......3.....178......34...4...72..9......7.48.2.......3.19..2",
|
||||
"8....193...523....9.2.....756...8...........1.9.....6.1..9.2.8......65....7..5...",
|
||||
"7.65.1....8...7...2.5........24..19.4.....8.6.9.67.5.....8.........56..21...92...",
|
||||
"...3.......5....87.3.8.7..2..64...15.5..312.62...7...4.....8.5.4.8.6..2.....1....",
|
||||
"9..7.5.....6.9....18....9.....9.....7...41..84536......3..84..7.......1...4...8..",
|
||||
"7.12....5.89......25.9...4.4...2.1...7.8.9......46..725..6...2.......9.7.2....5.4",
|
||||
"..58..7.973.......9.....12.4.3.......78....4..1...........3.8...5.28.97..9..14..5",
|
||||
"....4368....1..2.4....79..3.9.3.4...............6..921...7.....97...1.3..21.6....",
|
||||
"1.54..93.2.7...5...94........2.53.......6.157...9............7...9.......6..2..41",
|
||||
"7.6.5..8..9...6...5...2.....7.1.....85.....2.4....9....4.5..1...1...7.95...4..8..",
|
||||
"...4.1.....46..19....95.....2..4...6416....3.9.3......3..57..6..51.....77...1..4.",
|
||||
"196.7........2.9.......47.56.58...2......16.88...47..1..4......7.....8...2.......",
|
||||
".3..7.............7...32.8...3.98.655.6....2.8..1....3...9...5...7...2...9...6738",
|
||||
"2....7..9.3.49..624...3.1....5.....1.2...5.7............36...5..6.......51.9..3..",
|
||||
"..8...3.1.3.....5.1.6.2...97.5.1..2.3..2.....2..8..57...2...7.....9.8..........18",
|
||||
"..9.672.....4....1....92....6.2..91...89.1.43........82.....8..4..62.....31......",
|
||||
".2..9.81.96...1..2...5....9........5.9.8........2.3....7.....5335..7.19...63...7.",
|
||||
"5..4.........6..9.286.1.........971..27.5...88.1...4........6..9.....8...15..7...",
|
||||
"2.9.............9..165....71.....7..4..9.2.15.321..6..94...7.......3....67...5..2",
|
||||
".836....449...8.......3................4....81529......6..23....3..6921..15....3.",
|
||||
"........59...3.2..1.....6.3..9......2....8.464....29....49.....8..1....236.524...",
|
||||
".9...6......48.......132.6..2891.5..36....9.1....2.3........6.3.....4.9.6..3..418",
|
||||
"..12....5.94................3.5...8.948...........2.9..1...3..6.651...4....8.9.2.",
|
||||
"..5..9...9...5...7.4......6......5..8.2....9.5...42..1.61...8....89...754...6....",
|
||||
"41........7.1........25.....6..4.2.15....2.36...5...47..6......129.36.7.7.......4",
|
||||
"3.....59..1.9..6.2..23...71.975..2.....4......2...6...1.........6.7.5..4.7..32...",
|
||||
".........2..16.....68..7.....7....6..8.623..15...8..9...3.......9.51...81.5.9....",
|
||||
"7.82..6..9.6.4.....1465........6.5....1.....2......19...2.94.5.1.582.7.9.4..7....",
|
||||
".65127..8..1....52....3.67..........3.4.5.8....7483....5.........83..4.....86...7"
|
||||
};
|
||||
}
|
||||
124
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/package.bluej
Normal file
124
Quellcodes/Alg_DS_Sudoku/01_sudoku_roh/package.bluej
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
#BlueJ package file
|
||||
dependency1.from=BekannteZahl
|
||||
dependency1.to=SudokuPanel
|
||||
dependency1.type=UsesDependency
|
||||
dependency10.from=SudokuGitter
|
||||
dependency10.to=BekannteZahl
|
||||
dependency10.type=UsesDependency
|
||||
dependency11.from=SudokuGitter
|
||||
dependency11.to=Kandidatenmenge
|
||||
dependency11.type=UsesDependency
|
||||
dependency12.from=SudokuGitter
|
||||
dependency12.to=SudokuRaetselDB
|
||||
dependency12.type=UsesDependency
|
||||
dependency2.from=Kandidatenmenge
|
||||
dependency2.to=SudokuPanel
|
||||
dependency2.type=UsesDependency
|
||||
dependency3.from=SudokuFrame
|
||||
dependency3.to=SudokuGitter
|
||||
dependency3.type=UsesDependency
|
||||
dependency4.from=SudokuFrame
|
||||
dependency4.to=SudokuPanel
|
||||
dependency4.type=UsesDependency
|
||||
dependency5.from=SudokuFrame
|
||||
dependency5.to=Kandidatenmenge
|
||||
dependency5.type=UsesDependency
|
||||
dependency6.from=SudokuPanel
|
||||
dependency6.to=SudokuGitter
|
||||
dependency6.type=UsesDependency
|
||||
dependency7.from=SudokuPanel
|
||||
dependency7.to=Eintrag
|
||||
dependency7.type=UsesDependency
|
||||
dependency8.from=SudokuGitter
|
||||
dependency8.to=SudokuFrame
|
||||
dependency8.type=UsesDependency
|
||||
dependency9.from=SudokuGitter
|
||||
dependency9.to=Eintrag
|
||||
dependency9.type=UsesDependency
|
||||
editor.fx.0.height=940
|
||||
editor.fx.0.width=840
|
||||
editor.fx.0.x=24
|
||||
editor.fx.0.y=26
|
||||
objectbench.height=137
|
||||
objectbench.width=814
|
||||
package.divider.horizontal=0.6
|
||||
package.divider.vertical=0.7974683544303798
|
||||
package.editor.height=547
|
||||
package.editor.width=703
|
||||
package.editor.x=638
|
||||
package.editor.y=53
|
||||
package.frame.height=811
|
||||
package.frame.width=854
|
||||
package.numDependencies=12
|
||||
package.numTargets=9
|
||||
package.showExtends=true
|
||||
package.showUses=true
|
||||
project.charset=UTF-8
|
||||
readme.height=58
|
||||
readme.name=@README
|
||||
readme.width=47
|
||||
readme.x=10
|
||||
readme.y=10
|
||||
target1.height=50
|
||||
target1.name=Eintrag
|
||||
target1.showInterface=false
|
||||
target1.type=InterfaceTarget
|
||||
target1.width=80
|
||||
target1.x=270
|
||||
target1.y=320
|
||||
target2.height=50
|
||||
target2.name=Kandidatenmenge
|
||||
target2.showInterface=false
|
||||
target2.type=ClassTarget
|
||||
target2.width=140
|
||||
target2.x=160
|
||||
target2.y=440
|
||||
target3.height=50
|
||||
target3.name=SudokuGitter
|
||||
target3.showInterface=false
|
||||
target3.type=ClassTarget
|
||||
target3.width=110
|
||||
target3.x=480
|
||||
target3.y=260
|
||||
target4.height=50
|
||||
target4.name=Set
|
||||
target4.showInterface=false
|
||||
target4.type=AbstractTarget
|
||||
target4.width=80
|
||||
target4.x=20
|
||||
target4.y=310
|
||||
target5.height=50
|
||||
target5.name=SudokuFrame
|
||||
target5.showInterface=false
|
||||
target5.type=ClassTarget
|
||||
target5.width=110
|
||||
target5.x=330
|
||||
target5.y=50
|
||||
target6.height=50
|
||||
target6.name=SudokuRaetselDB
|
||||
target6.showInterface=false
|
||||
target6.type=ClassTarget
|
||||
target6.width=130
|
||||
target6.x=560
|
||||
target6.y=150
|
||||
target7.height=50
|
||||
target7.name=SudokuPanel
|
||||
target7.showInterface=false
|
||||
target7.type=ClassTarget
|
||||
target7.width=110
|
||||
target7.x=40
|
||||
target7.y=120
|
||||
target8.height=50
|
||||
target8.name=BekannteZahl
|
||||
target8.showInterface=false
|
||||
target8.type=ClassTarget
|
||||
target8.width=110
|
||||
target8.x=370
|
||||
target8.y=440
|
||||
target9.height=50
|
||||
target9.name=BitSet
|
||||
target9.showInterface=false
|
||||
target9.type=ClassTarget
|
||||
target9.width=80
|
||||
target9.x=20
|
||||
target9.y=390
|
||||
59
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/BekannteZahl.java
Normal file
59
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/BekannteZahl.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Repräsentiert eine "sicher" eingetragene Zahl in einer Sudoku-Zelle
|
||||
* Kann eine Vorgabe sein oder eine durch Schlussfolgerungen gesetzte Zahl sein.
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class BekannteZahl implements Eintrag
|
||||
{
|
||||
/**
|
||||
* Der Wert der bekannten Zahl
|
||||
*/
|
||||
private int wert;
|
||||
|
||||
/**
|
||||
* Die Farbe, in der die Zahl gezeichnet werden soll (für Backtracking-Situationen)
|
||||
*/
|
||||
private Color farbe;
|
||||
|
||||
/**
|
||||
* Erzeugt eine neue bekannte Zahl
|
||||
* @param w Der Wert der Zahl
|
||||
*/
|
||||
public BekannteZahl(int w)
|
||||
{
|
||||
wert = w;
|
||||
farbe = Color.BLACK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Markiert die Zahl, dies bedeutet, dass sie beim Backtracking "geraten" wurde
|
||||
*/
|
||||
public void setMarkiert()
|
||||
{
|
||||
farbe = new Color(140, 70, 120);
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet die Zahl auf ein Graphics-Objekt
|
||||
* Sollte nicht direkt aufgerufen werden.
|
||||
*/
|
||||
public void zeichneDich(Graphics g, Rectangle r)
|
||||
{
|
||||
g.setColor(farbe);
|
||||
g.setFont(g.getFont().deriveFont(65.0f));
|
||||
SudokuPanel.drawCenteredString(g, ""+wert, r);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt den Zahlwert der bekannten Zahl zurück
|
||||
* @return Der Wert der Zahl
|
||||
*/
|
||||
public int getZahl()
|
||||
{
|
||||
return wert;
|
||||
}
|
||||
}
|
||||
294
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/BitSet.java
Normal file
294
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/BitSet.java
Normal file
|
|
@ -0,0 +1,294 @@
|
|||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Eine Set basierend auf Bitvektoren
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version 26.9.2020
|
||||
*/
|
||||
public class BitSet extends Set
|
||||
{
|
||||
private ArrayList<Integer> daten;
|
||||
|
||||
/**
|
||||
* Erzeugt eine neue leere Set
|
||||
*/
|
||||
public BitSet()
|
||||
{
|
||||
daten = new ArrayList<Integer>();
|
||||
}
|
||||
|
||||
protected int[] alsArray()
|
||||
{
|
||||
int[] ergebnis = new int[anzahl()];
|
||||
int index = 0;
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i))
|
||||
{
|
||||
ergebnis[index] = i;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob die Menge kein Element enthält
|
||||
* @return true, wenn die Menge leer ist; false sonst
|
||||
*/
|
||||
public boolean istLeer()
|
||||
{
|
||||
for (int v : daten)
|
||||
{
|
||||
if (v != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob ein bestimmter Wert in der Menge enthalten ist.
|
||||
* @param wert Der zu suchende Wert
|
||||
*/
|
||||
public boolean enthaelt(int x)
|
||||
{
|
||||
if (x >= 32*daten.size() || x < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
int i = x / 32;
|
||||
int j = x % 32;
|
||||
int mask = 1 << j;
|
||||
return (daten.get(i) & mask) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt die Mächtigkeit der Menge zurück
|
||||
* @return Die Anzahl der Elemente in der Menge
|
||||
*/
|
||||
public int anzahl()
|
||||
{
|
||||
int laenge = 0;
|
||||
for (int i : daten)
|
||||
{
|
||||
laenge += Integer.bitCount(i);
|
||||
}
|
||||
return laenge;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bestimmt die Differenzmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, die von dieser Menge abgezogen werden soll.
|
||||
* @return Eine neue Set, die alle Elemente dieser Menge enthält, die nicht in s enthalten sind.
|
||||
*/
|
||||
public Set differenz(Set s)
|
||||
{
|
||||
BitSet ergebnis = new BitSet();
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i) & ~(bs.daten.get(i)));
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i) && !s.enthaelt(i))
|
||||
{
|
||||
ergebnis.einfuegen(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fügt einen neuen Wert in die Menge ein, falls er nicht bereits enthalten ist.
|
||||
* @param wert Der einzufügende Wert
|
||||
*/
|
||||
public void einfuegen(int x)
|
||||
{
|
||||
if (x >= 0)
|
||||
{
|
||||
int i = x / 32;
|
||||
daten.ensureCapacity(i+1);
|
||||
while(i >= daten.size())
|
||||
{
|
||||
daten.add(0);
|
||||
}
|
||||
int j = x % 32;
|
||||
int mask = 1 << j;
|
||||
daten.set(i, daten.get(i) | mask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge eine Untermenge der Menge s ist.
|
||||
* @param s Die Menge, die geprüft werden soll.
|
||||
* @return true, wenn jedes Element dieser Menge in s enthalten ist; false sonst
|
||||
*/
|
||||
public boolean untermenge(Set s)
|
||||
{
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
int a = daten.get(i);
|
||||
int b = bs.daten.get(i);
|
||||
if ((a & ~b) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
if (daten.get(i) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i) && !s.enthaelt(i))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Bestimmt die Vereinigungsmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Vereinigungsmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Vereinigungsmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public Set vereinigungsmenge(Set s)
|
||||
{
|
||||
BitSet ergebnis = new BitSet();
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i) | bs.daten.get(i));
|
||||
}
|
||||
for (int i = daten.size(); i < bs.daten.size(); i++)
|
||||
{
|
||||
ergebnis.daten.add(bs.daten.get(i));
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int[] a = s.alsArray();
|
||||
ergebnis.daten.addAll(daten);
|
||||
for (int n : a)
|
||||
{
|
||||
ergebnis.einfuegen(n);
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bestimmt die Schnittmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Schnittmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Schnittmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public Set schnittmenge(Set s)
|
||||
{
|
||||
BitSet ergebnis = new BitSet();
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
ergebnis.daten.add(daten.get(i) & bs.daten.get(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 32*daten.size(); i++)
|
||||
{
|
||||
if (enthaelt(i) && s.enthaelt(i))
|
||||
{
|
||||
ergebnis.einfuegen(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Entfernt einen Wert aus der Menge, falls er enthalten ist.
|
||||
* @param wert Der zu entfernende Wert
|
||||
*/
|
||||
public void entfernen(int x)
|
||||
{
|
||||
if (x < 32*daten.size() && x >= 0)
|
||||
{
|
||||
int i = x / 32;
|
||||
int j = x % 32;
|
||||
int mask = ~(1 << j);
|
||||
daten.set(i, daten.get(i) & mask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge und s die gleichen Elemente enthalten
|
||||
* @param s Die zu überprüfende Menge
|
||||
* @return true, wenn beide Mengen die gleichen Elemente enthalten; false sonst
|
||||
*/
|
||||
public boolean gleich(Set s)
|
||||
{
|
||||
if (s instanceof BitSet)
|
||||
{
|
||||
BitSet bs = (BitSet)s;
|
||||
for (int i = 0; i < Math.min(daten.size(), bs.daten.size()); i++)
|
||||
{
|
||||
if (daten.get(i) != bs.daten.get(i))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = daten.size(); i < bs.daten.size(); i++)
|
||||
{
|
||||
if (bs.daten.get(i) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (int i = bs.daten.size(); i < daten.size(); i++)
|
||||
{
|
||||
if (daten.get(i) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return super.gleich(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
16
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/Eintrag.java
Normal file
16
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/Eintrag.java
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Ein Eintrag in einer Sudoku-Zelle, kann entweder eine feststehende Zahl sein oder eine Menge von Kandidaten
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public interface Eintrag
|
||||
{
|
||||
/**
|
||||
* Zeichnet den Eintrag auf ein Graphics-Objekt
|
||||
* Sollte nicht direkt aufgerufen werden.
|
||||
*/
|
||||
void zeichneDich(Graphics g, Rectangle ziel);
|
||||
}
|
||||
56
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/Kandidatenmenge.java
Normal file
56
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/Kandidatenmenge.java
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Repräsentiert eine Kandidatenmenge für eine Sudoku-Zelle
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class Kandidatenmenge extends BitSet implements Eintrag
|
||||
{
|
||||
/**
|
||||
* Erzeugt eine neue Kandidatenmenge bestehend aus den Zahlen von 1 bis 9
|
||||
*/
|
||||
public Kandidatenmenge()
|
||||
{
|
||||
for (int i = 1; i <= 9; i++)
|
||||
{
|
||||
this.einfuegen(i);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet die Kandidatenmenge auf ein Graphics-Objekt
|
||||
* Sollte nicht direkt aufgerufen werden.
|
||||
*/
|
||||
public void zeichneDich(Graphics g, Rectangle r)
|
||||
{
|
||||
if (istLeer())
|
||||
{
|
||||
g.setColor(Color.RED);
|
||||
((Graphics2D)g).setStroke(new BasicStroke(3));
|
||||
g.drawLine(r.x,r.y,r.x+r.width, r.y+r.height);
|
||||
g.drawLine(r.x,r.y+r.height,r.x+r.width, r.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
g.setColor(Color.BLUE);
|
||||
g.setFont(g.getFont().deriveFont(20.0f));
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
for (int j = 0; j < 3; j++)
|
||||
{
|
||||
int n = 3*j+i+1;
|
||||
if (enthaelt(n))
|
||||
{
|
||||
int x = (int)(r.getX()+i*r.getWidth()/3);
|
||||
int y = (int)(r.getY()+j*r.getHeight()/3);
|
||||
int w = (int)(r.getWidth()/3);
|
||||
int h = (int)(r.getHeight()/3);
|
||||
SudokuPanel.drawCenteredString(g, ""+n, x, y, w, h);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
5
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/README.TXT
Normal file
5
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/README.TXT
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
PROJEKTBEZEICHNUNG: Sudoku
|
||||
PROJEKTZWECK: Implementieren Sie einen Teil eines Sudoku-Löser
|
||||
VERSION oder DATUM: Dezember 2020
|
||||
WIE IST DAS PROJEKT ZU STARTEN: Erzeugen Sie ein neues Objekt vom Typ SudokuGitter, entweder ohne Parameter oder mit einem int-Parameter (von 0 bis 399)
|
||||
AUTOR(EN): Rainer Helfrich, ZPG Informatik
|
||||
107
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/Set.java
Normal file
107
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/Set.java
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/**
|
||||
* Schnittstelle des ADTs Set
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version 26.9.2020
|
||||
*/
|
||||
|
||||
public abstract class Set
|
||||
{
|
||||
/**
|
||||
* Fügt einen neuen Wert in die Menge ein, falls er nicht bereits enthalten ist.
|
||||
* @param wert Der einzufügende Wert
|
||||
*/
|
||||
public abstract void einfuegen(int wert);
|
||||
|
||||
/**
|
||||
* Entfernt einen Wert aus der Menge, falls er enthalten ist.
|
||||
* @param wert Der zu entfernende Wert
|
||||
*/
|
||||
public abstract void entfernen(int wert);
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob ein bestimmter Wert in der Menge enthalten ist.
|
||||
* @param wert Der zu suchende Wert
|
||||
*/
|
||||
public abstract boolean enthaelt(int wert);
|
||||
|
||||
/**
|
||||
* Bestimmt die Schnittmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Schnittmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Schnittmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public abstract Set schnittmenge(Set s);
|
||||
|
||||
/**
|
||||
* Bestimmt die Vereinigungsmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, mit der die Vereinigungsmenge bestimmt werden soll
|
||||
* @return Eine neue Set, die die Vereinigungsmenge der beiden Mengen repräsentiert.
|
||||
*/
|
||||
public abstract Set vereinigungsmenge(Set s);
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge eine Untermenge der Menge s ist.
|
||||
* @param s Die Menge, die geprüft werden soll.
|
||||
* @return true, wenn jedes Element dieser Menge in s enthalten ist; false sonst
|
||||
*/
|
||||
public abstract boolean untermenge(Set s);
|
||||
|
||||
/**
|
||||
* Bestimmt die Differenzmenge der Menge selbst und der Menge s.
|
||||
* @param s Die Menge, die von dieser Menge abgezogen werden soll.
|
||||
* @return Eine neue Set, die alle Elemente dieser Menge enthält, die nicht in s enthalten sind.
|
||||
*/
|
||||
public abstract Set differenz(Set s);
|
||||
|
||||
/**
|
||||
* Gibt die Mächtigkeit der Menge zurück
|
||||
* @return Die Anzahl der Elemente in der Menge
|
||||
*/
|
||||
public abstract int anzahl();
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob die Menge kein Element enthält
|
||||
* @return true, wenn die Menge leer ist; false sonst
|
||||
*/
|
||||
public abstract boolean istLeer();
|
||||
|
||||
protected abstract int[] alsArray();
|
||||
|
||||
/**
|
||||
* Gibt zurück, ob diese Menge und s die gleichen Elemente enthalten
|
||||
* @param s Die zu überprüfende Menge
|
||||
* @return true, wenn beide Mengen die gleichen Elemente enthalten; false sonst
|
||||
*/
|
||||
public boolean gleich(Set s)
|
||||
{
|
||||
return untermenge(s) && s.untermenge(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt die String-Darstellung der Menge (aufzählende Darstellung) zurück
|
||||
* @return Ein String, der alle Elemente der Menge aufzählt.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
if (istLeer())
|
||||
{
|
||||
return "{ }";
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(int v : alsArray())
|
||||
{
|
||||
if (sb.length() == 0)
|
||||
{
|
||||
sb.append("{ ");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(", ");
|
||||
}
|
||||
sb.append(v);
|
||||
}
|
||||
sb.append(" }");
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
194
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuFrame.java
Normal file
194
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuFrame.java
Normal file
|
|
@ -0,0 +1,194 @@
|
|||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
*
|
||||
* Ein Fenster, um das Sudoku-Spiel darzustellen
|
||||
* Hier sollte nichts verändert werden.
|
||||
* @version Dezember 2020
|
||||
* @author Rainer Helfrich
|
||||
*/
|
||||
|
||||
public class SudokuFrame extends JFrame {
|
||||
|
||||
Point backtrackingPosition;
|
||||
int nextBacktrackIndex;
|
||||
JButton btnBacktrack;
|
||||
SudokuGitter dasSpiel;
|
||||
JLabel lblSackgasse;
|
||||
|
||||
public SudokuFrame(SudokuGitter sp, SudokuFrame parent) {
|
||||
|
||||
super();
|
||||
backtrackingPosition = null;
|
||||
dasSpiel = sp;
|
||||
nextBacktrackIndex = -1;
|
||||
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||
int frameWidth = 800;
|
||||
int frameHeight = 900;
|
||||
setSize(frameWidth, frameHeight);
|
||||
|
||||
if (parent != null)
|
||||
{
|
||||
parent.setEnabled(false);
|
||||
setLocation(parent.getX() + 20, parent.getY() + 20);
|
||||
}
|
||||
else
|
||||
{
|
||||
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
int x = (d.width - getSize().width) / 2;
|
||||
int y = (d.height - getSize().height) / 2;
|
||||
setLocation(x, y);
|
||||
}
|
||||
setTitle("Sudokus lösen");
|
||||
setResizable(false);
|
||||
Container cp = getContentPane();
|
||||
cp.setLayout(null);
|
||||
|
||||
SudokuPanel sudokuPanel1 = new SudokuPanel(sp);
|
||||
sudokuPanel1.setBounds(8, 8, 720, 720);
|
||||
cp.add(sudokuPanel1);
|
||||
|
||||
final JLabel lblGewonnen = new JLabel("Spiel gelöst");
|
||||
lblGewonnen.setBounds(220, 770, 400, 16);
|
||||
lblGewonnen.hide();
|
||||
cp.add(lblGewonnen);
|
||||
|
||||
lblSackgasse = new JLabel("Spiel so nicht lösbar -> Backtracking nötig");
|
||||
lblSackgasse.setBounds(220, 770, 400, 16);
|
||||
lblSackgasse.setForeground(Color.RED);
|
||||
lblSackgasse.hide();
|
||||
cp.add(lblSackgasse);
|
||||
|
||||
final JButton btnKandidatenListe = new JButton("Kandidatenmengen erstellen");
|
||||
final JButton btnEintrag = new JButton("Eintragen");
|
||||
final JButton btnAutomatisch = new JButton("Automatisch");
|
||||
btnAutomatisch.setBounds(8, 770, 200, 24);
|
||||
btnEintrag.setEnabled(false);
|
||||
btnBacktrack = new JButton("Backtracking-Schritt");
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnKandidatenListe.setBounds(8, 740, 200, 24);
|
||||
|
||||
AtomicBoolean bEintragungMoeglich = new AtomicBoolean(false);
|
||||
ActionListener alKandidaten = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
bEintragungMoeglich.set(sp.kandidatenMengenErstellen());
|
||||
if (bEintragungMoeglich.get())
|
||||
{
|
||||
btnEintrag.setEnabled(true);
|
||||
}
|
||||
else // Fehler -> Zurückgehen
|
||||
{
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnAutomatisch.setEnabled(false);
|
||||
lblSackgasse.show();
|
||||
}
|
||||
btnKandidatenListe.setEnabled(false);
|
||||
sudokuPanel1.repaint();
|
||||
}
|
||||
};
|
||||
ActionListener alEintrag = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
bEintragungMoeglich.set(sp.eintragen());
|
||||
if (bEintragungMoeglich.get()) // es war eine Eintragung möglich
|
||||
{
|
||||
btnKandidatenListe.setEnabled(true);
|
||||
}
|
||||
else // Man muss raten -> Backtracking
|
||||
{
|
||||
btnBacktrack.setEnabled(true);
|
||||
btnAutomatisch.setEnabled(false);
|
||||
backtrackingPosition = sp.getPositionVonKleinsterKandidatenmenge();
|
||||
if (backtrackingPosition == null)
|
||||
{
|
||||
if (sp.istGeloest())
|
||||
{
|
||||
lblGewonnen.show();
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnEintrag.setEnabled(false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Kandidatenmenge km = (Kandidatenmenge)sp.getEintrag(backtrackingPosition.x, backtrackingPosition.y);
|
||||
nextBacktrackIndex = 0;
|
||||
btnBacktrack.setText("Backtracking-Schritt 1 von " + km.anzahl());
|
||||
}
|
||||
btnEintrag.setEnabled(false);
|
||||
sudokuPanel1.repaint();
|
||||
}
|
||||
};
|
||||
|
||||
btnKandidatenListe.addActionListener(alKandidaten);
|
||||
cp.add(btnKandidatenListe);
|
||||
cp.add(btnAutomatisch);
|
||||
|
||||
btnEintrag.setBounds(220, 740, 200, 24);
|
||||
btnEintrag.addActionListener(alEintrag);
|
||||
cp.add(btnEintrag);
|
||||
|
||||
btnAutomatisch.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
if (btnEintrag.isEnabled())
|
||||
{
|
||||
alEintrag.actionPerformed(null);
|
||||
}
|
||||
while(true)
|
||||
{
|
||||
alKandidaten.actionPerformed(null);
|
||||
if (!bEintragungMoeglich.get())
|
||||
{
|
||||
break;
|
||||
}
|
||||
alEintrag.actionPerformed(null);
|
||||
if (!bEintragungMoeglich.get())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
btnBacktrack.setBounds(220+212, 740, 200, 24);
|
||||
btnBacktrack.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
int versuch = ((Kandidatenmenge)sp.getEintrag(backtrackingPosition.x, backtrackingPosition.y)).alsArray()[nextBacktrackIndex];
|
||||
SudokuGitter spNeu = sp.klonErzeugen(backtrackingPosition.x, backtrackingPosition.y, versuch);
|
||||
}
|
||||
});
|
||||
cp.add(btnBacktrack);
|
||||
|
||||
addWindowListener(new WindowAdapter(){
|
||||
public void windowClosing(WindowEvent e){
|
||||
if (parent != null)
|
||||
{
|
||||
parent.setEnabled(true);
|
||||
parent.nextBacktrackStep();
|
||||
}
|
||||
}
|
||||
});
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
private void nextBacktrackStep()
|
||||
{
|
||||
if (this.backtrackingPosition != null)
|
||||
{
|
||||
Kandidatenmenge km = (Kandidatenmenge)dasSpiel.getEintrag(backtrackingPosition.x, backtrackingPosition.y);
|
||||
nextBacktrackIndex++;
|
||||
if (nextBacktrackIndex >= km.anzahl())
|
||||
{
|
||||
btnBacktrack.setEnabled(false);
|
||||
btnBacktrack.setText("Backtracking-Schritt");
|
||||
lblSackgasse.show();
|
||||
}
|
||||
else
|
||||
{
|
||||
btnBacktrack.setText("Backtracking-Schritt "+(nextBacktrackIndex+1)+" von " + km.anzahl());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
504
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuGitter.java
Normal file
504
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuGitter.java
Normal file
|
|
@ -0,0 +1,504 @@
|
|||
import java.util.ArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.awt.Point;
|
||||
|
||||
/**
|
||||
* Repräsentiert ein 9x9-Sudoku-Gitter
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class SudokuGitter
|
||||
{
|
||||
/**
|
||||
* Die einzelnen Felder des Gitters
|
||||
* Erster Index = x-Koordinate
|
||||
* Zweiter Index = y-Koordinate
|
||||
*/
|
||||
private Eintrag[][] felder;
|
||||
|
||||
/**
|
||||
* Verweist auf das Fenster, in dem das Gitter dargestellt wird
|
||||
*/
|
||||
private SudokuFrame theFrame;
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit dem Rätsel Nr. 100
|
||||
*/
|
||||
public SudokuGitter()
|
||||
{
|
||||
this(100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit dem Rätsel Nr. 100
|
||||
* @param nummer Die Nummer des Spiels
|
||||
*/
|
||||
public SudokuGitter(int nummer)
|
||||
{
|
||||
this(SudokuRaetselDB.getRaetsel(nummer));
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit durch den String beschriebenen Spiel
|
||||
* @param spiel Eine String-Codierung des Spiels
|
||||
*/
|
||||
public SudokuGitter(String spiel)
|
||||
{
|
||||
this(spiel, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter als Kopie eines anderen Gitters
|
||||
* @param vorlage Die Vorlage für das neue Gitter
|
||||
*/
|
||||
private SudokuGitter(SudokuGitter vorlage)
|
||||
{
|
||||
this(vorlage.toString(), vorlage.theFrame);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Gitter mit durch den String beschriebenen Spiel
|
||||
* @param spiel Eine String-Codierung des Spiels
|
||||
* @param parent Das übergeordnete Fenster des neu erzeugten Fensters (kann auch null sein)
|
||||
*/
|
||||
private SudokuGitter(String spiel, SudokuFrame parent)
|
||||
{
|
||||
felder = new Eintrag[9][9];
|
||||
char[] cSpiel = spiel.toCharArray();
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (cSpiel[9*j+i] != '.')
|
||||
{
|
||||
felder[i][j] = new BekannteZahl(Integer.parseInt(""+cSpiel[9*j+i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
theFrame = new SudokuFrame(this, parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wandelt das Gitter in seine String-Darstellung um
|
||||
* @return Eine String-Darstellung des Gitters
|
||||
*/
|
||||
public String toString()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int y = 0; y < 9; y++)
|
||||
{
|
||||
for (int x = 0; x < 9; x++)
|
||||
{
|
||||
if (felder[x][y] instanceof BekannteZahl)
|
||||
{
|
||||
sb.append(""+((BekannteZahl)felder[x][y]).getZahl());
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(".");
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt den Eintrag an der gewünschten Koordinate zurück
|
||||
* @param x Die x-Koordinate des Eintrags (0 bis 8)
|
||||
* @param y Die y-Koordinate des Eintrags (0 bis 8)
|
||||
* @return Der Eintrag an der gewünschten Koordinate
|
||||
*/
|
||||
public Eintrag getEintrag(int x, int y)
|
||||
{
|
||||
return felder[x][y];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Zeile zurück
|
||||
* @param z Die Nummer der Zeile (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen der Zeile
|
||||
*/
|
||||
private Eintrag[] getZeile(int z)
|
||||
{
|
||||
return getZeile(z, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Zeile zurück, die einem Prädikat entsprechen
|
||||
* @param z Die Nummer der Zeile (0 bis 8)
|
||||
* @param pred Das Prädikat, mit dem die Einträge geprüft werden sollen; null für alle Einträge
|
||||
* @return Ein Array mit allen Einträgen der Zeile, die dem Prädikat entsprechen
|
||||
*/
|
||||
private Eintrag[] getZeile(int z, Predicate<Eintrag> pred)
|
||||
{
|
||||
ArrayList<Eintrag> a = new ArrayList<Eintrag>();
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
if (pred == null || pred.test(felder[i][z]))
|
||||
a.add(felder[i][z]);
|
||||
}
|
||||
return a.toArray(new Eintrag[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Spalte zurück
|
||||
* @param s Die Nummer der Spalte (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen der Spalte
|
||||
*/
|
||||
private Eintrag[] getSpalte(int s)
|
||||
{
|
||||
return getSpalte(s, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge der gewünschten Spalte zurück, die einem Prädikat entsprechen
|
||||
* @param s Die Nummer der Spalte (0 bis 8)
|
||||
* @param pred Das Prädikat, mit dem die Einträge geprüft werden sollen; null für alle Einträge
|
||||
* @return Ein Array mit allen Einträgen der Spalte, die dem Prädikat entsprechen
|
||||
*/
|
||||
private Eintrag[] getSpalte(int s, Predicate<Eintrag> pred)
|
||||
{
|
||||
ArrayList<Eintrag> a = new ArrayList<Eintrag>();
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
if (pred == null || pred.test(felder[s][i]))
|
||||
a.add(felder[s][i]);
|
||||
}
|
||||
return a.toArray(new Eintrag[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge des Blocks zurück, in dem die Zelle (x,y) liegt
|
||||
* @param x Die x-Koordinate der Zelle (0 bis 8)
|
||||
* @param y Die y-Koordinate der Zelle (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen des Blocks
|
||||
*/
|
||||
private Eintrag[] getBlockVon(int x, int y)
|
||||
{
|
||||
return getBlockVon(x, y, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt alle Einträge des Blocks zurück, in dem die Zelle (x,y) liegt, sonfern diese einem Prädikat entsprechen
|
||||
* @param x Die x-Koordinate der Zelle (0 bis 8)
|
||||
* @param y Die y-Koordinate der Zelle (0 bis 8)
|
||||
* @return Ein Array mit allen Einträgen des Blocks, die dem Prädikat entsprechen
|
||||
*/
|
||||
private Eintrag[] getBlockVon(int x, int y, Predicate<Eintrag> pred)
|
||||
{
|
||||
ArrayList<Eintrag> a = new ArrayList<Eintrag>();
|
||||
int xs = (x/3)*3;
|
||||
int ys = (y/3)*3;
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
for (int j = 0; j < 3; j++)
|
||||
{
|
||||
if (pred == null || pred.test(felder[xs+i][ys+j]))
|
||||
a.add(felder[xs+i][ys+j]);
|
||||
}
|
||||
}
|
||||
return a.toArray(new Eintrag[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sucht die kleinste Kandidatenmenge im Gitter und gibt ihre Koordinaten als Point zurück
|
||||
* @return Die Koordinaten der kleinsten Kandidatenmenge; null, wenn keine Kandidatenmenge im Gitter steht
|
||||
*/
|
||||
public Point getPositionVonKleinsterKandidatenmenge()
|
||||
{
|
||||
int min = 10;
|
||||
Point p = null;
|
||||
for (int y = 0; y < 9; y++)
|
||||
{
|
||||
for (int x = 0; x < 9; x++)
|
||||
{
|
||||
if (felder[x][y] instanceof Kandidatenmenge)
|
||||
{
|
||||
Kandidatenmenge km = (Kandidatenmenge)felder[x][y];
|
||||
if (km.anzahl() == 2) // besser kann es nicht werden
|
||||
{
|
||||
return new Point(x,y);
|
||||
}
|
||||
if (km.anzahl() < min)
|
||||
{
|
||||
min = km.anzahl();
|
||||
p = new Point(x,y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt eine Zahl ins Gitter ein, wenn es möglich ist. Wenn ja, löscht es alle Kandidatenmengen aus dem Gitter
|
||||
* @return true, wenn eine Eintragung möglich war; false sonst
|
||||
*/
|
||||
public boolean eintragen()
|
||||
{
|
||||
boolean ergebnis = nackterEinerEintragen();
|
||||
if (!ergebnis)
|
||||
{
|
||||
ergebnis = versteckterEinerEintragen();
|
||||
}
|
||||
if (ergebnis)
|
||||
{
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (felder[i][j] instanceof Kandidatenmenge)
|
||||
{
|
||||
felder[i][j] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt eine Zahl nach der "Nackter Einer"-Technik ins Gitter ein.
|
||||
* @return true, wenn eine solche Eintragung möglich war; false sonst
|
||||
*/
|
||||
private boolean nackterEinerEintragen()
|
||||
{
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (felder[i][j] instanceof Kandidatenmenge)
|
||||
{
|
||||
Kandidatenmenge kl = (Kandidatenmenge)felder[i][j];
|
||||
if (kl.anzahl() == 1)
|
||||
{
|
||||
int wert = kl.alsArray()[0];
|
||||
felder[i][j] = new BekannteZahl(wert);
|
||||
System.out.println("Schreibe " + wert + " an Stelle (" + i + "," + j + "), nackter Einer");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private BekannteZahl versteckterEinerEintragen(Kandidatenmenge km, Eintrag[] andereZellen)
|
||||
{
|
||||
Set ohneAlleAnderen = km;
|
||||
for (Eintrag e : andereZellen)
|
||||
{
|
||||
ohneAlleAnderen = ohneAlleAnderen.differenz((Kandidatenmenge)e);
|
||||
}
|
||||
if (ohneAlleAnderen.anzahl() == 1)
|
||||
{
|
||||
return new BekannteZahl(ohneAlleAnderen.alsArray()[0]);
|
||||
}
|
||||
else if (ohneAlleAnderen.anzahl() > 1)
|
||||
{
|
||||
System.out.println("das dürfte nicht sein");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt eine Zahl nach der "Versteckter Einer"-Technik ins Gitter ein.
|
||||
* @return true, wenn eine solche Eintragung möglich war; false sonst
|
||||
*/
|
||||
private boolean versteckterEinerEintragen()
|
||||
{
|
||||
// Suche Zahl, die nur einmal in Gruppe auftritt
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (felder[i][j] instanceof Kandidatenmenge)
|
||||
{
|
||||
Kandidatenmenge km = (Kandidatenmenge)felder[i][j];
|
||||
BekannteZahl bz = versteckterEinerEintragen(km, getZeile(j, x -> x instanceof Kandidatenmenge && x != km ));
|
||||
if (bz != null)
|
||||
{
|
||||
felder[i][j] = bz;
|
||||
System.out.println("Schreibe " + bz.getZahl() + " an Stelle (" + i + "," + j + "), versteckter Einer in Zeile");
|
||||
return true;
|
||||
}
|
||||
bz = versteckterEinerEintragen(km, getSpalte(i, x -> x instanceof Kandidatenmenge && x != km ));
|
||||
if (bz != null)
|
||||
{
|
||||
felder[i][j] = bz;
|
||||
System.out.println("Schreibe " + bz.getZahl() + " an Stelle (" + i + "," + j + "), versteckter Einer in Spalte");
|
||||
return true;
|
||||
}
|
||||
bz = versteckterEinerEintragen(km, getBlockVon(i, j, x -> x instanceof Kandidatenmenge && x != km));
|
||||
if (bz != null)
|
||||
{
|
||||
felder[i][j] = bz;
|
||||
System.out.println("Schreibe " + bz.getZahl() + " an Stelle (" + i + "," + j + "), versteckter Einer in Block");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prüft, ob das Spiel gelöst ist
|
||||
* @return true, wenn das Spiel gelöst ist; false sonst
|
||||
*/
|
||||
public boolean istGeloest()
|
||||
{
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (!(felder[i][j] instanceof BekannteZahl))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Erzeugt einen Klon des aktuellen Gitters und setzt eine Zelle auf einen bestimmten Wert
|
||||
* @param x Die x-Koordinate des zu setzenden Feldes
|
||||
* @param y Die y-Koordinate des zu setzenden Feldes
|
||||
* @param wert Der zu setzende Wert
|
||||
* @return Die Kopie des Gitters
|
||||
*/
|
||||
public SudokuGitter klonErzeugen(int x, int y, int wert)
|
||||
{
|
||||
SudokuGitter sp = new SudokuGitter(this);
|
||||
BekannteZahl raten = new BekannteZahl(wert);
|
||||
raten.setMarkiert();
|
||||
sp.felder[x][y] = raten;
|
||||
sp.theFrame.setTitle("Sudokus lösen: Versuch (" + x + "," + y + ") <- " + wert);
|
||||
return sp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Trägt in allen Zellen des Gitters, an denen bisher null steht, die Kandidatenmenge ein
|
||||
* @return true, wenn alle Kandidatenmengen nichtleer sind; false sonst
|
||||
*/
|
||||
public boolean kandidatenMengenErstellen()
|
||||
{
|
||||
boolean bLeereMenge = false;
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
Eintrag[] spalte = getSpalte(i, x -> x instanceof BekannteZahl);
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
if (felder[i][j] == null)
|
||||
{
|
||||
Kandidatenmenge kl = new Kandidatenmenge();
|
||||
Eintrag[] zeile = this.getZeile(j, x -> x instanceof BekannteZahl);
|
||||
for (Eintrag e : zeile)
|
||||
{
|
||||
BekannteZahl bz = (BekannteZahl)e;
|
||||
kl.entfernen(bz.getZahl());
|
||||
}
|
||||
for (Eintrag e : spalte)
|
||||
{
|
||||
BekannteZahl bz = (BekannteZahl)e;
|
||||
kl.entfernen(bz.getZahl());
|
||||
}
|
||||
Eintrag[] feld = getBlockVon(i, j, x -> x instanceof BekannteZahl);
|
||||
for (Eintrag e : feld)
|
||||
{
|
||||
BekannteZahl bz = (BekannteZahl)e;
|
||||
kl.entfernen(bz.getZahl());
|
||||
}
|
||||
if (kl.istLeer())
|
||||
{
|
||||
bLeereMenge = true;
|
||||
}
|
||||
felder[i][j] = kl;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bLeereMenge)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
boolean bAenderung = true;
|
||||
while(bAenderung)
|
||||
{
|
||||
bAenderung = false;
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
Eintrag[] bereich = getZeile(i, x -> x instanceof Kandidatenmenge);
|
||||
if (nackteZweierEliminieren(bereich))
|
||||
{
|
||||
bAenderung = true;
|
||||
System.out.println("... in Zeile " + i);
|
||||
if (getZeile(i, x -> x instanceof Kandidatenmenge && ((Kandidatenmenge)x).anzahl() == 0).length > 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
bereich = getSpalte(i, x -> x instanceof Kandidatenmenge);
|
||||
if (nackteZweierEliminieren(bereich))
|
||||
{
|
||||
bAenderung = true;
|
||||
System.out.println("... in Spalte " + i);
|
||||
if (getSpalte(i, x -> x instanceof Kandidatenmenge && ((Kandidatenmenge)x).anzahl() == 0).length > 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
int row = (i / 3)*3;
|
||||
int col = (i % 3)*3;
|
||||
bereich = getBlockVon(col, row, x -> x instanceof Kandidatenmenge);
|
||||
if (nackteZweierEliminieren(bereich))
|
||||
{
|
||||
bAenderung = true;
|
||||
System.out.println("... in Block (" + col + "," + row + ")");
|
||||
if (getBlockVon(col, row, x -> x instanceof Kandidatenmenge && ((Kandidatenmenge)x).anzahl() == 0).length > 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return !bLeereMenge;
|
||||
}
|
||||
|
||||
private boolean nackteZweierEliminieren(Eintrag[] bereich)
|
||||
{
|
||||
for (int i = 0; i < bereich.length; i++)
|
||||
{
|
||||
Kandidatenmenge a = (Kandidatenmenge)bereich[i];
|
||||
if (a.anzahl() != 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for (int j = i+1; j < bereich.length; j++)
|
||||
{
|
||||
Kandidatenmenge b = (Kandidatenmenge)bereich[j];
|
||||
if (b.gleich(a))
|
||||
{
|
||||
int[] zweier = a.alsArray();
|
||||
for (Eintrag mm : bereich)
|
||||
{
|
||||
Kandidatenmenge m = (Kandidatenmenge)mm;
|
||||
if (a != m && b != m)
|
||||
{
|
||||
int vorher = m.anzahl();
|
||||
m.entfernen(zweier[0]);
|
||||
m.entfernen(zweier[1]);
|
||||
if (m.anzahl() != vorher)
|
||||
{
|
||||
System.out.println("Nackter Zweier " + zweier[0] + "" + zweier[1]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
99
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuPanel.java
Normal file
99
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuPanel.java
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* Ein Panel, in dem das Sudoku-Spiel gezeichnet wird.
|
||||
* Hier sollte nichts verändert werden.
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*/
|
||||
public class SudokuPanel extends JPanel
|
||||
{
|
||||
/**
|
||||
* Das Spiel, das dargestellt werden soll
|
||||
*/
|
||||
private SudokuGitter dasSpiel;
|
||||
|
||||
/**
|
||||
* Erzeugt ein neues Panel
|
||||
* @param s Das Spiel, das dargestellt werden soll.
|
||||
*/
|
||||
public SudokuPanel(SudokuGitter s)
|
||||
{
|
||||
dasSpiel = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet das Spiel auf ein Graphics-Objekt
|
||||
* @param gg Das Graphics-Objekt, auf das gezeichnet werden soll
|
||||
*/
|
||||
public void paintComponent(Graphics gg)
|
||||
{
|
||||
Graphics2D g = (Graphics2D)gg;
|
||||
g.setColor(Color.WHITE);
|
||||
g.fillRect(0,0,getWidth(),getHeight());
|
||||
g.setColor(Color.BLACK);
|
||||
g.setStroke(new BasicStroke(5));
|
||||
int w = getWidth()-5;
|
||||
int h = getHeight()-5;
|
||||
g.drawRect(2, 2, w/3, h);
|
||||
g.drawRect(2+w/3, 2, w/3, h);
|
||||
g.drawRect(2+2*w/3, 2, getWidth()-2*w/3-5, h);
|
||||
g.drawRect(2, 2, w, h/3);
|
||||
g.drawRect(2, 2+h/3, w, h/3);
|
||||
g.drawRect(2, 2+2*w/3, w, getHeight()-2*h/3-5);
|
||||
g.setStroke(new BasicStroke(2));
|
||||
for (int i = 1; i < 9; i++) {
|
||||
g.drawLine(2+i*w/9, 2, 2+i*w/9, h);
|
||||
g.drawLine(2, 2+i*h/9, w, 2+i*h/9);
|
||||
}
|
||||
int cellWidth = w/9;
|
||||
int cellHeight = h/9;
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
int x = 2+i*w/9;
|
||||
for (int j = 0; j < 9; j++)
|
||||
{
|
||||
int y = 2+j*h/9;
|
||||
Eintrag e = dasSpiel.getEintrag(i, j);
|
||||
if (e == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Rectangle r = new Rectangle(x+5, y+5, cellWidth-10, cellHeight-10);
|
||||
e.zeichneDich(gg, r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet einen String in einem Rechteck zentriert auf ein Graphics-Objekt
|
||||
* @param g Das Graphics-Objekt, auf das gezeichnet werden soll
|
||||
* @param text Der zu zeichnende Text
|
||||
* @param rect Der Bereich, in den der Text zentriert werden soll
|
||||
*/
|
||||
public static void drawCenteredString(Graphics g, String text, Rectangle rect) {
|
||||
drawCenteredString(g, text, rect.x, rect.y, rect.width, rect.height);
|
||||
}
|
||||
|
||||
/**
|
||||
* Zeichnet einen String in einem Rechteck zentriert auf ein Graphics-Objekt
|
||||
* @param g Das Graphics-Objekt, auf das gezeichnet werden soll
|
||||
* @param text Der zu zeichnende Text
|
||||
* @param x x-Koordinate der linken oberen Ecke des Rechtecks
|
||||
* @param y y-Koordinate der linken oberen Ecke des Rechtecks
|
||||
* @param w Breite des Rechtecks
|
||||
* @param h Höhe des Rechtecks
|
||||
*/
|
||||
public static void drawCenteredString(Graphics g, String text, int x, int y, int w, int h) {
|
||||
// Get the FontMetrics
|
||||
FontMetrics metrics = g.getFontMetrics();
|
||||
// Determine the X coordinate for the text
|
||||
x += (w - metrics.stringWidth(text)) / 2;
|
||||
// Determine the Y coordinate for the text (note we add the ascent, as in java 2d 0 is top of the screen)
|
||||
y += ((h - metrics.getHeight()) / 2) + metrics.getAscent();
|
||||
// Draw the String
|
||||
g.drawString(text, x, y);
|
||||
}
|
||||
|
||||
}
|
||||
444
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuRaetselDB.java
Normal file
444
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/SudokuRaetselDB.java
Normal file
|
|
@ -0,0 +1,444 @@
|
|||
|
||||
/**
|
||||
* Eine "Datenbank" mit 400 Sudoku-Rätseln
|
||||
*
|
||||
* @author Rainer Helfrich
|
||||
* @version Dezember 2020
|
||||
*
|
||||
* Rätsel erzeugt mit https://qqwing.com/generate.html
|
||||
*/
|
||||
public class SudokuRaetselDB
|
||||
{
|
||||
/**
|
||||
* Gibt das gewünschte Rätsel zurück
|
||||
* @param nummer Die Nummer des Rätsels
|
||||
* @return Das Rätsel als String codiert.
|
||||
*/
|
||||
public static String getRaetsel(int nummer)
|
||||
{
|
||||
if (nummer < 0 || nummer >= 400)
|
||||
{
|
||||
return ".................................................................................";
|
||||
}
|
||||
System.out.print("Rätsel Nr. " + nummer + " (");
|
||||
if (nummer < 100)
|
||||
{
|
||||
System.out.print("einfach");
|
||||
}
|
||||
else if (nummer < 200)
|
||||
{
|
||||
System.out.print("mittel");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nummer >= 300)
|
||||
System.out.print("sehr ");
|
||||
System.out.print("schwer");
|
||||
}
|
||||
System.out.println(")");
|
||||
return raetsel[nummer];
|
||||
}
|
||||
|
||||
private static String[] raetsel = {
|
||||
"..42...18..2.4....1..68..9.26...9..7...7..28..87...9.3...4.....4..........8.3..2.",
|
||||
".5.6.3......2.......3.7.....2..69.574.....8.97..54..26....2.6......8..34...9.62..",
|
||||
".642....99...5....1.54.8..624....3.........1..8.3.1452.2.....6.......8.3.....42..",
|
||||
"...3..15.....1.......7.......36...4..7.2853..8.1..76..7..52...3.2.8..4...3...6...",
|
||||
"6..21..9...85....6.4.9..82.1..4.6.5.....7.2.94.9..5.7...........8.......5.264....",
|
||||
"5...6...973.2..4.....5..3......2.6..3........8..4......5.9.8.7..2.....356.7...9.8",
|
||||
".9....45.......3...5..3.127..849..7..29.538...7.2...9..8....74...........43..591.",
|
||||
"1......4.8.7..2.1.2.......9..9..43..3.8...7.4..286...........7173..9.48......69..",
|
||||
"...693..2..4...........13......8.9......4..37...1.98..4.1...69.37......1...2.6...",
|
||||
".8.....4........6...931....8.649..237.........4..3..174...61.9..92....3...7......",
|
||||
"...6.8.....59.4.3..9.2.....5.7........672...5.4...3..2.......4.862......9....53..",
|
||||
"..9..6.4....4...2.5......7......7.....5......76...9.....1.5.3..3.462.5..9...741..",
|
||||
"...2.....9..71....1............8.2.78..9....37.91....5.8..7.43......45.84...5.1.2",
|
||||
".93..518..2.....34..51....7.7...3......981.....927......249..........8....1..29..",
|
||||
"8.....2..2.9.7..38.....1.7......6......3.2.41.8479.3..31....78..........76.......",
|
||||
"..47.....56...917..1.6.54.8.5..367.4..3..851.....7........4............9......85.",
|
||||
"6....34.......539........6...6.......35.4982...968..7..435....9.2.....4.......2..",
|
||||
"...6.1.3..2.9.....85..27.6....8......3..5....5...6.......3.9.7.9.1.....6.7..1..59",
|
||||
"..........8....1.49.1..7.2.......872....4..1.........3..85...3.7...91..5.5.42...8",
|
||||
".........7.....6....5.....8..9.283.717.69.....2.3..1.....8...1.5.6..18.3..8...7.2",
|
||||
"3..91....4....59..1...2.......486...8...5.2........1...5.2...98.6..4.....1.6.9.4.",
|
||||
".37....1...............54...1.2.8..4.9..13.7.7.5.....14..............29835...97..",
|
||||
".1.9..8..5..1....286......3...3.8..7..5.26......5........6......87..2.9...9....56",
|
||||
"...6952.7...4..3.8........5...9.3.5.....7...29...5...65....28.473..64...8........",
|
||||
"5.......123.9.6.....9..53.44.5..3..7.1.6.9..576..4..133.....1........7....7.....6",
|
||||
"..........8...9....9...1..26..4..89532..95.6...........14....8.96..2..1.......2.3",
|
||||
".78.41.5.4........9.15...48...3..5...42..7...8..95.71.137.....9......3...........",
|
||||
"4.568.1..........6..831...9........33...5.8.2......95...1.3..25.2....3..8.4.6....",
|
||||
"...5.7.1..7......2...9.......18..6..98.65.1..5.6.......3...2..7...13..8......8.9.",
|
||||
"7.26....4.3...4....16......1....24..2.98167....3.9.....2....9.6.91.3.........7.1.",
|
||||
"9.3....71....65..2..........1..........82..9.......5.6.3....1.7..92....32.7...86.",
|
||||
".2...896......9.5718..........29.6...6....24..4.....18........4..6...1..57.....2.",
|
||||
"...7..4.5.......934....167....2.3.......1....562.9.....3..6791.2..13.........5...",
|
||||
"149.2....3.8..............196...2.......4.76...2....84....74893.8..6..1...3......",
|
||||
"2.157....56..8.....8...1...............246....16..7.4...8.2.6....746312...27....4",
|
||||
"648.....79.73....5.5....18.3......6..65...734..4.......7..8..16........8..9..45..",
|
||||
".......4..7..39.....9..7..5..3...4...1.....28..4.....1.589.....2..7.41...3..1.8.9",
|
||||
"9..........47...........9.31..98.......2.......5..1.74...87.4..3..1.25..257.3..1.",
|
||||
"8..9...7..64...39.....542.8....6.......3.8.5..7..4......7..246...387....5....3...",
|
||||
"8..5..7...9.........3.81.2...5.........162......7..6.2........1...92.58.9..6.3.7.",
|
||||
"4..6.2............5.379.4...2...6.8375...8.6..3.4.....9.7.436.....9.......6.2....",
|
||||
"....6....8.....9.4.............3......7..438.4..6.8..5..6..14.95..8..13..193..87.",
|
||||
"....4.3..6.4.9..7..237....956....72...2......1....5.64.5.......9....3....3.....12",
|
||||
".............6.......79...2..4.....57.2.85...5....918.2...479.1.57......19.8...64",
|
||||
"7..48.3.92...69......7...8..9.6..24.......9..5....36...5...........9.4......32.7.",
|
||||
"..6.....2425...1.6.....3.5..13.9...4......38..4....2.9..8.......64.8....39...26..",
|
||||
"..3..29..19.46..7.2..7.8..3..8.7...........3292....71........4..1...9...34.......",
|
||||
"..7.4.....1...3...93.812....9...748...832.1.9.2..........9..........18..3815.4...",
|
||||
"87..3.4...........1.29..7.8...21...4.19.87............3....5.9.9.73.....481.7....",
|
||||
"........1.....19.58.........6..8....5...7..23.7.39.8..9...3.6....1625.3...2..9...",
|
||||
"...6..1.9.....3.6.2....13.5..3.4.29....8.56.........5.4.9.3...2.2.....81....9....",
|
||||
"3.....1...5..7...26...159.77.46........4..53..29..3.6....2....5....9......1......",
|
||||
"4...8.6.297..2..5.8.3........4....7...8.7.2.4..7..5..9......5...5.3...4.......827",
|
||||
"5...9..18...3..4........35.....6.2.3........7....53.9.41.82....3....9.2..795.1.4.",
|
||||
"............4...89.......6...4.5.81...5.9.6.3..7.61..534.5......6.91.4..8.9.....7",
|
||||
"...4.7.....45..937.56..9.......9..65..9..8..38..756.2.......7.....3.4.....2....5.",
|
||||
"....5.89..3..6.7.15.7.....6.2.9.....7..8...........2...62.8...7..5..73629..3...8.",
|
||||
".7.....9.2.9.34.85...7.8..24..2.........57...7..8.96.......5.3........7..4..2..5.",
|
||||
".89.....3..475...1....38..4..5.....8...38..1.....42....17.2....43.517...5.2..4...",
|
||||
"......59..68..41..4.1..2...5.2.....3..3..94.21......8.3...158..6......3..8.....5.",
|
||||
"...6.7....9.....5..7...198.76...45.9...275...............8........1.67...81.52.94",
|
||||
"..2......6..4....1.31.9....7..2.4....59.37.............7...2..62.3.6.....9.15.3..",
|
||||
".....3..1...98.....7..268...283...14.....496..61...7.2....78......6..2.3......6..",
|
||||
"....8.......2.6.8.7..31.6..4....821..3.....7.21.67384.84.1...6.396..2............",
|
||||
".1...5......36..54....419.......8..36.5.9481.......67.....76435.4.18.7...........",
|
||||
"........4.2..3.51.....2...3......18...29..7.5....8...9.8..1....1.4..789.39...845.",
|
||||
"..5..693..3.24..5.6.97.......6...3.................4...4.6.5...37...26.....3..8.2",
|
||||
"............3..1........3.78....25.63...6..2...248573..4..2.8..6...574....1..3..2",
|
||||
"83.6.1.....2.....1..5.23....1.8......68....1......7..5.5.7........43....27..86.3.",
|
||||
".76..53.......27....2....89...21..6........5......7....3..5....15....93.6..89.2..",
|
||||
"76..9...3......2.....587.1....2.....9.....1.....3...9....73..86.3...69.......85.2",
|
||||
"..9...8..18.5...73.36....9...3...5...5.....6.61.....823...186.7.75.29............",
|
||||
".3.6...2...5.2..7..2..376..4.....1..8.1....67...4.6.58........1.....3.45..7..8.3.",
|
||||
"......4.5.29..............6..8.6..9.....5..78.9.23.56...4.8....25...7..3.37.2..4.",
|
||||
"19.........83.1.....58...........4.6.12.46.58.3.....9..6...413....95......3.....5",
|
||||
".4.............5....1..3..44.8..67.1.59....3.......8651..6......9675.3.......4..7",
|
||||
"4..2865..2...37.9.....5...3...7.........2....7...9....82..7...69.6....3.5.3.6948.",
|
||||
".7.....6.......3.53..8.4....1.......7....8523..6..2..4.6.3.....5..7......341..7..",
|
||||
".3...7..15.42..9.8.2.58.......7.9.2.......195....4...7.5.81..32........9.......7.",
|
||||
"96.4...13....968..5..8..9.4..4..3..6....6..7....5.4.......51..........57...6.93.8",
|
||||
"62...8.3..9........1....5..3...9......4.....6...8.2.....953..848..9..31...64...2.",
|
||||
"74...9...95.3.6.2....4.8..5......39.8......67..2...4..3...9.7.8.........5.....239",
|
||||
"...91.2..1.63....43...7.5....3..2.9..5..4967.4.7....2.......3...........64....1..",
|
||||
".7...4..232..564.11..2...7................6..46.....3...81....5......2..2.64.37..",
|
||||
"8..5.......3..1...59176....1..23.......9.58.79.76......3.8.2..6..6.7....2...5.9..",
|
||||
"4...28.7...6..7..587.94...1...21.7......7.9.6..15...4.9...5...4.........5....9...",
|
||||
"......9....57....8..69.35.73.2.48..6..4....9..8..3...42.9.........5.....8......29",
|
||||
"......8...5.49...2.8.35.1.4.....9.7...217..........5....1........8..429...9..3..8",
|
||||
".2.......7.6.9....9....2.4...3...129.......36......7...417..2.5..74...9.23.....6.",
|
||||
"..9.........2.14.8.........6.......3.85.63.....1.45.9......93...23..4....6.8..1.4",
|
||||
"6.......4...18...598...4....5..7....8.495.1.7..6..8..25.1....26..7......24...7...",
|
||||
"...5....9..1..2....4.8..56.......4......7.81...4.1.....5...69.82....46..81.7....2",
|
||||
"9.2.7..58...2....1.81..9.23....1.........7.....4...13..49.81....385.....2.7..4..5",
|
||||
".4......52...........5...2938...6....5672..8.9..4.....4....38.....9....6..7.6.2..",
|
||||
".....3......18.3..4...79..8.73....4..18.27.........5...............4.1...415.893.",
|
||||
"18..576.465....7....7...5..53...1...4....8.93.....3....741....8......9.186.....7.",
|
||||
"....9...2..4.......2...6...3.1.64.7..82...1..4....29.3.7.......1.34....6..9831...",
|
||||
"..5..6.3....1...98..1..976........598.....2..62..7....2.......1.7..3.......6...23",
|
||||
"....78.9..9.1...4.1.8...6....26.........5.781.......5..4...68.....21.5..........9",
|
||||
"....7...9....42..7..6..5...5.27...1..6...14...4.9.68.5.51..9...9.8.2.............",
|
||||
"..594...78...534..6.2....5.7......464.6...329.3...........9....974...6.8..3...2.4",
|
||||
"2....9.6.5..........1...3.534..5.....1.73..9.7.5.26.........75..9....1.3.......49",
|
||||
"..8.5.9..75.......4.....23.91..7.8.2...........5482.....1..3...8..52......3891...",
|
||||
"7.56.......1........4.2.1.3...46..2.6....8.7..1..3.4......72...8...1...2........4",
|
||||
"...32...7....8......5...213....47......9..1.5.71...89..42.3.......5..7.........21",
|
||||
"...2..5.....18...........1..1.7.2..95...3...6..7.9.18.8....7...7..92..6.65.....32",
|
||||
"5........8.......7....79....9.......4.7.28..62..9.73....85...64.2..6.....4578.2.9",
|
||||
"......8...9.3.....8.....4....37...2....9.2.1...9....7..3.2.59..7..13.....5.48...3",
|
||||
".9....2.5....9....1.......4.4.6.2.....71.4.6.8..9..1..2.....597....7..1.5.....4..",
|
||||
".1..78.4.85..2.7....65....1.......979.7.412...61........2.....8.....9......75....",
|
||||
"7..41....2.........3...9....2.......34.76.2..6.7.95..39....3.2..6.12..4......61..",
|
||||
"........75.....12..7..41..8....6..1.....728.4......75...76.....1.5..3.6..6.4....5",
|
||||
"4....6...9....4..3..1..79.8.63.7.....9.3.871.......5....7.........59..........85.",
|
||||
"9...7..4..42.163..3.6.9..2...3.215................47....5........736..9.......17.",
|
||||
"..6...7.448........975.4..8..3......71.......6.....9.18.1..5.97....3.5...4.7...1.",
|
||||
"...2.6...9.....2347..........8.35....3..7..59.......4.34........9.6..37..56.....2",
|
||||
"54.....9..219....68..312....8.6..51.2.6.....9..4.5..3.9...6.....3....8..........5",
|
||||
"..9.5...21.543.....239.....3.1.....5.......8....81..9...4.....6...6..23..6...8..4",
|
||||
".9......4.1...6....68739.2..3..2..........5...2.....1...324..8..7...1.3...26.....",
|
||||
".7..6...3.684....2.....8....2..93....3...75....9....8..876.9..........5.2.......4",
|
||||
".......9..9........3..15..6.126..58.6..1..........9.3........592...38...58.7...2.",
|
||||
"2....8.67.3.217....8....3........7..5.....8.....5.4....4...3....2.6.158.7..8....1",
|
||||
"1..4.......69.23...........2.4..571..79..14.6........24.7.5.19........35.5......4",
|
||||
"7.....8..3.4..759...2.93.6..43.6.....6...5.3.8...4..........7.55....2.......78...",
|
||||
".....6.....92.4.....3...8.4...73..589......42...9..3....6...78.8...2..9.....796.5",
|
||||
"793.....5....6.......3.1..8.3.1......57.....96.9....73......9..184.....6.76..5.8.",
|
||||
"....3........2..6....698..1.8......3..6.1.52........1.1..2...844...6...92...49.3.",
|
||||
"5..7.....86.5..4.3.......8.15.8.4...63........4..1.3..7..1...5........27......1.6",
|
||||
"1..........8....6296...3.1...9...82.6.1..9.37.3........74.........9.4..88....6.71",
|
||||
"9..5.1.2...39.....8....6..1..6.1..3..3.275.1.18..9.5.2............8...9......2..8",
|
||||
".9....8..7..3...........6.4.5.7...4...3..9...6.82.3....8.....73..6...48..3..4.5..",
|
||||
"1.7.5.....3.......5...89.3........42.8..7......25.1....94..83..8..4..........21..",
|
||||
"9......12135.2.8.......8..5.186..3....4.......2693....8....62........5.9.......6.",
|
||||
"..57...6.9....4.....2.....4.972...1.46......5.5..41........6.73.1..7952.......1..",
|
||||
".....89..4........2.9.31......3....2.....4..1.1.58..9.3.1..62...9..4..8....2.9.5.",
|
||||
"......18...6.....3..16.24.....8....5...536..8....74....1..8..7..38...561..4..3...",
|
||||
"73...1.......3...45.2..................1...4...48..51...56.2..7.1..7348...85....6",
|
||||
"..3...1..6..25..4.4..........2...........63......1.....4.62.85.5...812.37.......1",
|
||||
"6..31.5.............3......5.916.7.316........7......59.18.2.....2....98.8.7...1.",
|
||||
"...3...5..9...281...4...9.27...59...8....174.........89.2..7........3......428..3",
|
||||
"1....3..5..2...3.4.3.48..178.1......37..2..58.....64....71.2........4............",
|
||||
".3..9.5....5..3.9..29..6.8.57.8......9.....7....5.....71.....6.....6....6...1.827",
|
||||
"...1.52.8.2.4..16........4.1......2..423......3.....5...1.467....67..8...8.2.1..6",
|
||||
".....63..3.89..2.62.......4.7.4........6...35...57...2..3....5....7.8....24.....3",
|
||||
".3....5.....2....45194....8......6.2....9.....83.469......3.1......68.93...9.....",
|
||||
"8...7.....7314......16.........2......291..43..94.86.77...6..1.21........34......",
|
||||
"....9...2..............6.1.6.2..15....1..9....5.4.3.....46.279..9..3...413..4..5.",
|
||||
"..5.1..6.92..5.4.1..38..5..582..36....49.............2.......8.3.14.......6..2...",
|
||||
".......67.3...1....2.........18.7.3....1.6.8..7..3964...92...13264..3..93....8...",
|
||||
"4...63.......5.21..65..79......295.....7.1..2......4....71..62....634.........3.5",
|
||||
"16....37.5.........83...2....2..516.....3...4..1......41.3...2.......6..3562..81.",
|
||||
"..12..7.6..79......2.7.5.9.....6.54.4.5...8.26..8....1.....8...9.......4.....1.5.",
|
||||
"..29...1.....15.377...2....42........8.....7.5........9.5..4.818...5.7.4.3..71.9.",
|
||||
"1.3..4.7.....8...2.6..1..........5....4..3..6356.......82....3..7.......5...621.4",
|
||||
"38.45..1..17....9...5.8.7...4.89.......716..9.....5....3.16..............51...8.7",
|
||||
"....42.38.6.38........95..6......5.7649.......5..2.4.......67.3.........8.3..7.9.",
|
||||
"...9.2.5....38.9..5...1..6.32...............1.7.......93.5....285...1.7...1..7..8",
|
||||
"......6....5....7....296...52.93..1.......7...3..67.9...3.2.9.......5.81..168...2",
|
||||
"....9..6......3...6.5......1..2..4...9..6..1..3...5..28......51.1..5.2......34.9.",
|
||||
"2...9.....861.3..5.3........12..98....9.2....57.8.1.9.3....7....5...863........5.",
|
||||
"8.49.27...7..8..4...6...28..5.4.......753.9......7863...2..4.............4...3.9.",
|
||||
"5..1..9....8...1...9......33....1.9....6..8..1..3.56.4....685.......4.2..26.3....",
|
||||
"2.4.8..6....6......6.235....3..615.4..89....6...8..............48..9.2..5.1...3..",
|
||||
"..4.....3..35..8.....1....28....1.962.9.5..481....42..3...6.......9...1....2....5",
|
||||
"67.4..32.....8..14..1.....9.8.3.2.....4.7.....3.81......3.69.4..4.....7......3...",
|
||||
"4....1.57.3.6.....16..5...9..9....8...576.9.18......7.....95........4...7.38.....",
|
||||
"........5642.......751......8.6.1..77..2..5.8....8..1.8..35.46......2.5...47.....",
|
||||
"..79......1....2.7.....8....78..3..2.32..5..8.91...6...6..7.9.......6.1..2.8...5.",
|
||||
"4.6..8.2...5.....77..9.3.469...............5......79...32.......8.5........4..832",
|
||||
"274....9.......5.65....9...6......4.42.............18791...4..8...6....1.561.79..",
|
||||
"4.6.3..9..219.6...3..14..6.....8.......613.4.......38951.2.....8..........48.....",
|
||||
".4.21..6.2.....94..7.4.9.587.46.5...8219......5........6...7..........8.9..5.....",
|
||||
".542...3....14.....3.6....9.7.3....2.....9..46.97...5.24....9..3...1.........6..5",
|
||||
"..4......9.2.8.....6.3.78...73.....95..67.2..24.5.9......8......5..32..6329......",
|
||||
"5.8.67..16..5.19....9.2....19.6..........4...475.....6.5.........1.78..52...1....",
|
||||
".1.........7...89.29..............177..28.6.5.3..1..2..6.3.....5.89....61..8.5...",
|
||||
"..7.6258.....8..195..........32.9....8.5...3..5...6....3.......7...1..6.812......",
|
||||
"1..6....3..9..52....24..8..2..8.....58..149.........1.4.........53...4.6.9.....2.",
|
||||
".2..4.5.....5.2...........7.8...........7621.....517..5.16...9826...........97...",
|
||||
"..521....9...8.......5.4..22.1.......7.......3.47.1.9.8.7.2.3...9.1......4...9..8",
|
||||
".97.3.....8...........4...9....91.....5..2.91...3....82......7.7.35..94.8.47...5.",
|
||||
".531....4..6....9..24....6..8..35.1....2.693....48.2....564..2...9.5.............",
|
||||
"9.1..6.......5...464...97....4...5...3....6.117....32..........4596.3....63...4..",
|
||||
"..415...7.7....62.....24.8.7..9......9....5.8.5....76....6..8.2..6.......28....9.",
|
||||
"...12.3.......5....8....7.1..52.....867......3...9..5.9..3..16..7.6....9..6....3.",
|
||||
"..316..7.9....74...7.....68....75...65..8.....47.1.5.3...4.....1.....7....9......",
|
||||
".1.2.....9.3.61..5..2.....3.7..1..........4....9..5......7.6....45.936....1.5..7.",
|
||||
"8..96...5.....1.3.132...69.6...123..3.1.5...4.....95....42..1..2....8............",
|
||||
"..........437...1.561......675419.3..........4.9......79...14.6....6...81..85..7.",
|
||||
"..4.9....28...6.....6.3.....3.8....94...138...2....34.6........513...6....9.42...",
|
||||
"31................8...63...2..7.5.83.......4.13...46......5.4....3.1..72.7.8...51",
|
||||
".641.....19.37.6..3.8.......56...1..7...9.....4......7...96.4.5...5...78.8..3....",
|
||||
"9....1..4.............5...9.89.....65...28.......3..51..15.42..3...8..9.....631..",
|
||||
"....9....5..3..61.4.165......2.3.16.7.......5...1.7..9.4.5.37.2......5.....72....",
|
||||
"1.87.92....5........324.57....9.1.8.3..8.4..72.....1.....5.2.......37......4...5.",
|
||||
"..6598.........5.9...........8.6....6.19.5..8....21.3..9.1..2..23..5...6..7..2...",
|
||||
".2..13.4.3...4571....9..3.2.46.5.........2.....5..1....5...7..94..52....7.9.....3",
|
||||
"..1.......5...23..8..436......69.1.......8.96.2.1....531.8.4..9985.2.............",
|
||||
"..2...8.4...9.47....6.5793.83.....6......5..87....2....6.4....7.4.3.....3........",
|
||||
"5..8..........6..26.84127.........6.274...........81..1......5.8..354.....2...8..",
|
||||
"6..1.7....8.......1.4.68.........78..9.....2.23..7.61..4....3....9.8....81792....",
|
||||
"..2.41.9..843........5.9.....3.....7.4..7..298.....4.5...9.28..2..837.......5....",
|
||||
".....68..9....32....3.2.79..5..6..7..81.........91...6.....53.1.1........2.6...5.",
|
||||
"5......371..56....48..73...9..8..6.5..1....7.....1.9.....3.....6..1.8.4......4.5.",
|
||||
".3.........2..9......168......3.....1...2...6..6.....7...87..248...1..6..43...19.",
|
||||
"2...65..7.6.3.1..4....7.1.2.3.......4.5........2...91.926...47.3....9....71......",
|
||||
"..2...7.9375.1..2.........5..76...8.....916..2..73...........671.....29..6.2..13.",
|
||||
".....1...5.64.9..1.34.....5..7......81.7..3..3.9......7...96.58.....7....6.5.87..",
|
||||
"........9......36...5.8.2.15.2.4.....19.2..56.68..3..........2...4.5...8....1.93.",
|
||||
"...8...72....728......9..4....1.........4...7..7..816.32....6....1629..3.....1.8.",
|
||||
"...4...7.3...7...11.83....97......3.......6......6..18..1..8.93..9..4.8.6....9.5.",
|
||||
"..89.5.....24.1.5....68...4.6..3..4.8..5..1..4.1..9..8.95.............6.31.......",
|
||||
"5...23.1...3..........64.7..6....2.1.38....672..45.83....2..........5....261.7...",
|
||||
"..865..47...4.721...........629....5.4.......59.7....278..........2.95....15.....",
|
||||
"..7..26....2.....8.5.6.8.32.132.4...7..5.....58.31...........56....31...........4",
|
||||
"..9...8........7..54.7....29.786..1.8.....9...6........7415.68.65...2.74.........",
|
||||
"8.467.....7.5.8.366.59..........3..84....91.........93.1.7...89.......5...63.....",
|
||||
".91....8.....6.3.1.26.91.4.7.431.............8.....1.7...........9.7.8...4...963.",
|
||||
".6..7...4.....4..17..69.....8..2....4.79..3...3.4.6..92..1...9...12.7.....8.....3",
|
||||
".9..........5.1...1....83.6..1....5...4..3..8.6..2.1...5.4..8...4..125..6..9..2..",
|
||||
".81......23....4.....4......4....1......3..9.1.8..9..2..9....363....721..6..1.7..",
|
||||
"89...71..............95.84...4...519........6..8...4..4.5......98.1.67..67...439.",
|
||||
".....15..1.872..3....6...7...2.1.....4......5.3...81.4.87......4...7.....2..5.6..",
|
||||
"3.....61..8..6...71.6379....3.7.8........48..........224..97.8......3....9..8.43.",
|
||||
".5..3....1.7...83.6.........1.....4.463............5.7....57..2..4.2..6..7..46..3",
|
||||
"......68......23..867..32....9.............18.3....765..3..8...1.8....927..5.9...",
|
||||
".3.1.98.4..5.436...6......19..7..4.........67....38...3....1....5.3.6.9.....5....",
|
||||
".1..692.7.5.........8..76.3.8.712.......8......5..6...2.....16..9..2...8.3.......",
|
||||
"782.5....6.........5.1..3......42..75..3.761.8....5.4........7..........2.1...45.",
|
||||
"68.59....7.......89....2.54.25...........15...6..4...1...8...62....2.74...7....1.",
|
||||
"4.7....8...2...3..85.43...957.29.....2..4...7...5..2...8.....7.6..9.......4...85.",
|
||||
"..2.19.....56......6.387..26.......3..7...526.......1...325..9.7..9.8.......6....",
|
||||
"......15...9.253.6.....79..........5..7..4...2...5......3.....75..9..42..9.41..6.",
|
||||
"..61......8...7.3...4.3..758....6..........1...342...8.....8....17.63...43...5...",
|
||||
"............53...9..9..1.5..6..9521..7..265..8.............819....6...8......7.36",
|
||||
"...2...4......38....6.5.3.98.5.4793..43.......9.....27.32.....84.....59..7.......",
|
||||
".7.4.3.......62...6..71.....61.4.5....2.5.......6.14...1.52...3.3....6..74.9..2.1",
|
||||
".4....6.3.15....4.39........56.48.39....5..1...3....8......3.955.4...86..79......",
|
||||
"6......7.5....81.....7.64.......36.1..18.473....6.28.5.........254.......83..7...",
|
||||
"8.172......6.9.....2..8...7...5..7.....918.....8.4.61....1...29..7....51.9...4...",
|
||||
".687..4.......9.3.925....872.4.8..56.9..63...6...........4.....4......6.58......2",
|
||||
".5..1..342...6.58.9.....1..3..259..8...1.........839..5....23..........1...53.6..",
|
||||
"1.69........6.1..7.....4...3..5.74..4....9...879.6..1.98.....5...43........845.6.",
|
||||
".3......2..5..4..8.746.35........7.6.6.4...232...9.45.....5.....9..........2..8..",
|
||||
"....7...3.7..9..2..9....6..8.4.....9....62..1..13....7......7.29..42.186.1...8...",
|
||||
"...........7...2....8...4.62.........76.49.....432.9.8...2...6.64..1.8.9..38...42",
|
||||
".3..216.....46......9.73....1...2.........4...94...72..52..4....6....3.7..1.....4",
|
||||
"641..............78.2..4.6..579..........2...4....1...72..1.9.61...9.......4.8.15",
|
||||
".1...3...459.2...183..5...2..5....4..9....38.1..9......4...56.3...26...........54",
|
||||
"1..5..9.......8.14........56.4.........1......8..457...68.........63..9.95...137.",
|
||||
"1.37....4...4.9..1.....5...4.......2...9....7..7..3........7.5..1.3.6..992.15..73",
|
||||
"8.3...7.97.........9.....1897...6..2.3............1.572.879.5..........1.....3.8.",
|
||||
"96.32415.....9....3....1.26.......8..3...56.4.4..8..95.....8.398..53...1.......6.",
|
||||
".2..........4..7........8....78.4..1.1.92..34.5.3......392..17.8.........7...84.2",
|
||||
".5.23.......6..8....8...5.....1......39.6.....4....9...8....4.33.....62.2..45.19.",
|
||||
"..71..5....98.6..4.51..498...5.4.......5..7...4...1..3398.7...................4..",
|
||||
".7.6...38.34.2..5.1...87.2.4.7...6....3..2.8...6.4...7....368......782...........",
|
||||
"73...5.2..1...84.............3......6.....2..1.4..2.5.87.....3......1.45..67...8.",
|
||||
".2..7..5137.8.12.4.5.42....8..5...72...2.........3..4.........5.1.....3.....836.7",
|
||||
".....52172....9.5........4.59........42.........8.2......9..174..54.8.....76....8",
|
||||
"38...2...1.6.5..7.....3.8.92..1...5..1.8...62.5...6....9..2.7.............73.....",
|
||||
".......5....182..4....46..2...91....32...4.8.64.............2....83...69....91..8",
|
||||
".5.......3..765....8.2..4.15..........36........1...87...3....2..6.7.14....42.76.",
|
||||
"1..5.27.......76.94....31...4..9.....154.....2....5...69.......7...56....217..4..",
|
||||
"...5.372....84.3...31........472..8...54.........89...92.....5.....9714.......23.",
|
||||
"...6...7........1..34........85.4...1..7.3...97..614....13..86..5.....9..6..8.7..",
|
||||
"..34..8...8...6...2..7..3...4.9..6...72.4....631.....4.....8726.2.....41.........",
|
||||
"2..3.514.61..2.....3.78.........48.3.2......5...25.47.5...4....7......12......68.",
|
||||
"2.4......9.1..827.7..5..8.......7...........56...9....1.7..9.....8..4.9..6.2..1..",
|
||||
"..4...5.....48..1.1...2.7.3.48..5...2...1.35.........2............6.8...3..15.46.",
|
||||
"......3.4..9....8..4....51.72.......3......9..817.......79.84..29..34.57..52...3.",
|
||||
"7......8..3.....1..65....3.4.3..5.9.19....5...7............6...8..7.49....7.3.14.",
|
||||
"2........87..2.9...3.9........2..4..3...1..86.92..67.3..4......9274.8.6..8.......",
|
||||
".6.........9.758....1.......2.6.1.459..4..2.....85....6..5.8.....5..918.8......7.",
|
||||
"..31....278......41.9.......1.....73.46....8......2.6.2.4..6........96...3...4..7",
|
||||
"..56.....8....1...7...8.......9.85..12...5..7..7...8..2..5.619.4...........2..65.",
|
||||
".9.......7.8.3....36.9.....6..72...9...1..58....5....32...5...1.7..6..3.5...7...6",
|
||||
"23...48757.5.....2.........4..2..5..9.34.8..66......8........54.92...6..86.....9.",
|
||||
".1.........9...2.8...5.471...43....9.8....3252..............15..432.5.8..7...1...",
|
||||
".3.....9....7.....2..8....7.6.9............35..2.65......23754.....5.3..8..6...7.",
|
||||
"..51....94...5.1..2.36..4......6.....48...9........821..1.3..9..82.....46...1.2..",
|
||||
".1..52.9...536.....931...7....21.9...8.......7..6......59...6.......3...........2",
|
||||
"....8..9..74....3.9.3.......1...3........9.....987.24.4.8....1..2.51......59..723",
|
||||
"..83.4.1...2....7......18.....168....86.....3......2..69..1.4.....4.3......9...82",
|
||||
"...3.6...6.7..9.....97......7..8...2..36....99.4..78.....5...2..5.....372.8......",
|
||||
"..8....7.36......81..3.6..........34.3.1.97...85..7.....645........18.4.7........",
|
||||
".4........3...1.5.8.2.9.1..2...15.6.59.3..81.41.2....3.....4..9...953............",
|
||||
"4...583..6........89.43....1.89..6.3.....5....4..637.55.7.89.....9.......6.7.....",
|
||||
"5......2.....9..8....3........9.6.7...758......9.3.5181.5.7..9..76......8....2..1",
|
||||
"9.....2.........3......9..4..8143...4..2....52....8...5..43.....2..5..1.17.....8.",
|
||||
"6......21.41..25.3....9.7.............5..741.......63...2.3..469........3.74.6.52",
|
||||
"..8....56...25..7...3.69.1.1...9.........376..37..........1.....94.2.....5.6...8.",
|
||||
"...8.1.24.7.9346............2...6....3...27.....14..6...8....3...........92.6..48",
|
||||
".6...4.....4..368......9.3...8.1.....9...2...43....81..23..6.9.54.......6..29....",
|
||||
"..89...5.7.1..2.......7....379..4....4.3.......2.59....1.....4.2.7..83.9.3.2.7...",
|
||||
".5.6..23...98.....21..9....4.52...6....9......21.8....8.6..4..........45........1",
|
||||
".....9....5..6.4.....7.......8.4..76...93...1.9...154......4..5..159.6.4..5.7.18.",
|
||||
".........3.9.....4...796....63......18...49..95..8...14.71...3.5.....4.8...3.9...",
|
||||
"............38...17...168.99.........5.19..7.84..3......68..7......5.6..3....95..",
|
||||
"....5.......8..71.5..23.........1..9.25...8....7........392...7..1....5..8....926",
|
||||
".....2..8.3...76..8..15..2.74....8....1...23.2...75.6.1..........7.3..5..6.......",
|
||||
"6......9.....3.58.75.......3.89.4..6.7...3......17...4.9....1..5..6..7.88.6......",
|
||||
".......81.........14....2..9...21...8..7...5347..3.......5.4.3..2...9...3.5.7..1.",
|
||||
"3.4.9.....6.5...8..98..7...5....167.....345...3......8..7.8.........64....5....6.",
|
||||
".2............68...1..39.5..3..5.6.........315.......9....63.8.4..5....6..94..2..",
|
||||
"..6......53..........954.......657...98...6....781...4.......573...7........83.9.",
|
||||
"3....8.......9.....71.24..58.7.52.9.2..8.........47.2351..........9.3....8..1..4.",
|
||||
".7.......419.....76....84......9......13.482.3.26..9..836.41...1..2.6............",
|
||||
"......6...4............9852..5.3...8..4.96..13.2.5..4...6..42.9.3.....8.8.9......",
|
||||
".......6..6...2...2....5.......6....8..4.7...6.4.2.59.5.......3.8..9.4..7..84..2.",
|
||||
".........7.....9....92....4.4.13.....16..87.......7.2....9.1..86...7.2.39.43.....",
|
||||
".537.6..........59..624......9.6.84...2.....7...8.7.9......9..3.....846....65...8",
|
||||
".275........16..4.4....2..9......9.7..59...12........46..2.....5..4.9.6....7..8.5",
|
||||
".3..2..8......4...8..61..7.69..8....7.8...2...1.....38..1...9..9.6.3..4.4...72...",
|
||||
".472.....8.5.69...2..5.....3..7...4.......25...6...9...9..4.7...3.8.5..4..8.....2",
|
||||
"34...5.911984...766.5...4.8...6....59...58.....31.4.......3.......5.6...4.19.....",
|
||||
"...97.....3..1....718..4.....4.5......6..8....8.1...356..3..97..93..........8.4..",
|
||||
"..5..7.......842.7.2....4...9....6.....42....1.7..9.2.5.4.6..1...1........2.98...",
|
||||
".....6.497.....61..5.......3..9...652.....7...71......5.....1.44327.........95.3.",
|
||||
".2...4.....8.7.63.9..2....4.....9.5.......2.6...68..4...2...9.3.36.....7.....5...",
|
||||
"..........9.1....8.....65.....9.8..2.71...9.....2..6..1..7...5...8..4..676..592..",
|
||||
"..2.....7....4..81.........3.....8696....74...243..7...194...32...72.9.4.....6...",
|
||||
"3..89.627..87....3.............3..8.6...7.1..2.398...5.......6.9..62......1...9..",
|
||||
"...1..9.88..2.6..4.......6..5.......9.....72...4.2...5..5...17..92......1...54...",
|
||||
"........81..6.7.3....341.2.93.....167.193..4.8....2..3.....6.....849....4...18...",
|
||||
"...5.87...53....1......7..66.1..5..2.329.1.....8.2..5..8......3...6......2....67.",
|
||||
"8.7.6..9...2.3...6....17.8.316..87.2......9.8...2...1...5......7.......3.....6..7",
|
||||
"1.7.5..29..4......5..6.2.......7...4...1...9........57.1.54..7.4.9...8...5..2..6.",
|
||||
"...6...8....1.8.7.....32.....8.7315.1.4.2..........2..75.....4.6.2....1....715..6",
|
||||
"3.1...25...45..1..92...63....8.4....2.......1.9....6......84.2.....15.....932.4..",
|
||||
"..573...1....4.6..........96...7.4.5.....9136..........86..4...5..1.....94.3.5..8",
|
||||
"9...6........15...715.......9.1485..6...9..........8..4.6....75.2..561.9.....4..8",
|
||||
".......2.......3...2....78.87.9.4..1..1..2..8.3..5.97....4795...1...84..7.......3",
|
||||
"....6.43.....5.......1.3...4.1.7..2..37........284..7..2...68.416..8.5.3...5....2",
|
||||
"....23.7..39...5..2..49.6..46..7.9...2....3.7..8.......96..24..7........5...69...",
|
||||
"....4852......2..4..7.3....56.....4.7..95......9.....7..63.....92...67..458.7....",
|
||||
"..6..2..5......4....4..5.96.8.7...63.3..2.95...7.6..2................2.9...3.6..8",
|
||||
"....6...787.4.3..9.43...5.....3.58.4......73.....4...27..8..6..........5..267...3",
|
||||
"5...2...86........972..64..4...1.8..76.5.9.4.1.9..8..5......1.6...1...5....4..7..",
|
||||
"45.3...6.1....9..3..7.........73..4....5846.....9.6..15..61.9...7........83......",
|
||||
"..9.87.516..91.........2...3.1....9.9......758.2..51......23.....3.7.2.8........9",
|
||||
"5...3.49.8..4.56...3...9..1.....3.............5...1.32..39...6.48.6....5......8..",
|
||||
"4...25.1.7...49..2.............61.4.9...74.6...79...........9....2..73.4...23.1..",
|
||||
"...6.2.....4.5.7.22..7..8.97.2....4.3.....6...95.......69....844...9.3...8..6....",
|
||||
"..69.7.4..2.3.1...8..62.9........8...4......3.7...9..24...78.2..8....7.63........",
|
||||
"71..3..68.....6..2..3....4982.4...1....1...83...27.....41..2.....7.....438.......",
|
||||
"...4...6...23....4.9..2.1.32.7.9.....69......18...32..72........16...9....4.6...8",
|
||||
"1...4..255....9..88..31.....4...3.......8..92.7..54...4....1.....9...8.1.......57",
|
||||
".3.......5...1....91758.4...2..34...4......92..52..14....97.8..8.......5.9.3.....",
|
||||
".36...21.528....63....3.........8.9....976.....3.2...76..7....2....19.5....8...3.",
|
||||
"72...5.....1...96...3.....86.5.18.9..12.....7.......5..6.....3..971....6.....2.8.",
|
||||
"..9....8....73.........47....3.......8..1.....4..9317.....423...6.87.4.9.....6.1.",
|
||||
".8.6.....1...4....763...1............1...75.4576.9......7..4.9.....38....4.7...83",
|
||||
".6...2...5......24..2.58.....7.2....4593..7.....54.3......64.7....93.....36.....8",
|
||||
"....4.5....8.3.....53.9.4.8...76.3...17....9...58........6.397...........7..85134",
|
||||
"......8...4..2.6.9...6...3...7..31848.......3......7...2...6.....4....9.9.61.83..",
|
||||
"...86.217.3.9.........5.8....5..197..8..2.....2.3.56..5.....7........19...3..9.5.",
|
||||
".1.957...5.9864..............6.2......84952.....7..4.....5....4.41.89...7....269.",
|
||||
"..........1.3..7...3..46....58....6...9..54.11.3..7.8....4...79.967...1.4...8.6..",
|
||||
".....69......7....3.72...5......4....3.8....6...9.2.357....9....49.2.78.85.4.....",
|
||||
"64.9...7...8......93..24.8..1..7..4..9......6....4.........2..4.2..1..3...638....",
|
||||
"..47.3.5...........2.6...83........6.5.13...4...82....3...5.1..28.3..4.7.71.....2",
|
||||
".897....651..68.3...2...8....3.1..62.2...57.....37..8....28........36...6..5.1...",
|
||||
"5....2..........2..6...7..1......25...7.3...4.5.2843.....56.83...1..3..7....4.1..",
|
||||
"16.......2.8.6.......8...4...4.3.85..3..5...2...41...3.5.1.....672.........5...8.",
|
||||
".4...9.7.......4233.7......5..8.....9..5.6.872...4.3...95...8.26.........8.4...96",
|
||||
"8....2.16..6...3...4.....8..3.......9.2.....8..5..9..32.3.8.1.....5...6.51....9..",
|
||||
"79..4.1..8.3.7..466.453.9......5......6...8......9.753......58......4......78.69.",
|
||||
".....6.4..4.72........35..2....8.29.....72..85..6...3...9...87.6...57..4...3..9.6",
|
||||
".1....6.4.....1...3.84.......1..2.594.3..5..25...6....6..8.9......253.4.....14.9.",
|
||||
"....2.75....8.1.6.5..6.........781.......6.2..2.....3...7.....43.6...87......4..5",
|
||||
"71........29......5.......3.....178......34...4...72..9......7.48.2.......3.19..2",
|
||||
"8....193...523....9.2.....756...8...........1.9.....6.1..9.2.8......65....7..5...",
|
||||
"7.65.1....8...7...2.5........24..19.4.....8.6.9.67.5.....8.........56..21...92...",
|
||||
"...3.......5....87.3.8.7..2..64...15.5..312.62...7...4.....8.5.4.8.6..2.....1....",
|
||||
"9..7.5.....6.9....18....9.....9.....7...41..84536......3..84..7.......1...4...8..",
|
||||
"7.12....5.89......25.9...4.4...2.1...7.8.9......46..725..6...2.......9.7.2....5.4",
|
||||
"..58..7.973.......9.....12.4.3.......78....4..1...........3.8...5.28.97..9..14..5",
|
||||
"....4368....1..2.4....79..3.9.3.4...............6..921...7.....97...1.3..21.6....",
|
||||
"1.54..93.2.7...5...94........2.53.......6.157...9............7...9.......6..2..41",
|
||||
"7.6.5..8..9...6...5...2.....7.1.....85.....2.4....9....4.5..1...1...7.95...4..8..",
|
||||
"...4.1.....46..19....95.....2..4...6416....3.9.3......3..57..6..51.....77...1..4.",
|
||||
"196.7........2.9.......47.56.58...2......16.88...47..1..4......7.....8...2.......",
|
||||
".3..7.............7...32.8...3.98.655.6....2.8..1....3...9...5...7...2...9...6738",
|
||||
"2....7..9.3.49..624...3.1....5.....1.2...5.7............36...5..6.......51.9..3..",
|
||||
"..8...3.1.3.....5.1.6.2...97.5.1..2.3..2.....2..8..57...2...7.....9.8..........18",
|
||||
"..9.672.....4....1....92....6.2..91...89.1.43........82.....8..4..62.....31......",
|
||||
".2..9.81.96...1..2...5....9........5.9.8........2.3....7.....5335..7.19...63...7.",
|
||||
"5..4.........6..9.286.1.........971..27.5...88.1...4........6..9.....8...15..7...",
|
||||
"2.9.............9..165....71.....7..4..9.2.15.321..6..94...7.......3....67...5..2",
|
||||
".836....449...8.......3................4....81529......6..23....3..6921..15....3.",
|
||||
"........59...3.2..1.....6.3..9......2....8.464....29....49.....8..1....236.524...",
|
||||
".9...6......48.......132.6..2891.5..36....9.1....2.3........6.3.....4.9.6..3..418",
|
||||
"..12....5.94................3.5...8.948...........2.9..1...3..6.651...4....8.9.2.",
|
||||
"..5..9...9...5...7.4......6......5..8.2....9.5...42..1.61...8....89...754...6....",
|
||||
"41........7.1........25.....6..4.2.15....2.36...5...47..6......129.36.7.7.......4",
|
||||
"3.....59..1.9..6.2..23...71.975..2.....4......2...6...1.........6.7.5..4.7..32...",
|
||||
".........2..16.....68..7.....7....6..8.623..15...8..9...3.......9.51...81.5.9....",
|
||||
"7.82..6..9.6.4.....1465........6.5....1.....2......19...2.94.5.1.582.7.9.4..7....",
|
||||
".65127..8..1....52....3.67..........3.4.5.8....7483....5.........83..4.....86...7"
|
||||
};
|
||||
}
|
||||
127
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/package.bluej
Normal file
127
Quellcodes/Alg_DS_Sudoku/02_sudoku_loes/package.bluej
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
#BlueJ package file
|
||||
dependency1.from=Kandidatenmenge
|
||||
dependency1.to=SudokuPanel
|
||||
dependency1.type=UsesDependency
|
||||
dependency10.from=SudokuGitter
|
||||
dependency10.to=BekannteZahl
|
||||
dependency10.type=UsesDependency
|
||||
dependency11.from=SudokuGitter
|
||||
dependency11.to=Kandidatenmenge
|
||||
dependency11.type=UsesDependency
|
||||
dependency12.from=SudokuGitter
|
||||
dependency12.to=Set
|
||||
dependency12.type=UsesDependency
|
||||
dependency13.from=SudokuGitter
|
||||
dependency13.to=SudokuRaetselDB
|
||||
dependency13.type=UsesDependency
|
||||
dependency2.from=SudokuFrame
|
||||
dependency2.to=SudokuGitter
|
||||
dependency2.type=UsesDependency
|
||||
dependency3.from=SudokuFrame
|
||||
dependency3.to=SudokuPanel
|
||||
dependency3.type=UsesDependency
|
||||
dependency4.from=SudokuFrame
|
||||
dependency4.to=Kandidatenmenge
|
||||
dependency4.type=UsesDependency
|
||||
dependency5.from=SudokuPanel
|
||||
dependency5.to=SudokuGitter
|
||||
dependency5.type=UsesDependency
|
||||
dependency6.from=SudokuPanel
|
||||
dependency6.to=Eintrag
|
||||
dependency6.type=UsesDependency
|
||||
dependency7.from=BekannteZahl
|
||||
dependency7.to=SudokuPanel
|
||||
dependency7.type=UsesDependency
|
||||
dependency8.from=SudokuGitter
|
||||
dependency8.to=SudokuFrame
|
||||
dependency8.type=UsesDependency
|
||||
dependency9.from=SudokuGitter
|
||||
dependency9.to=Eintrag
|
||||
dependency9.type=UsesDependency
|
||||
editor.fx.0.height=739
|
||||
editor.fx.0.width=892
|
||||
editor.fx.0.x=959
|
||||
editor.fx.0.y=44
|
||||
objectbench.height=142
|
||||
objectbench.width=814
|
||||
package.divider.horizontal=0.6
|
||||
package.divider.vertical=0.790436005625879
|
||||
package.editor.height=542
|
||||
package.editor.width=703
|
||||
package.editor.x=977
|
||||
package.editor.y=47
|
||||
package.frame.height=811
|
||||
package.frame.width=854
|
||||
package.numDependencies=13
|
||||
package.numTargets=9
|
||||
package.showExtends=true
|
||||
package.showUses=true
|
||||
project.charset=UTF-8
|
||||
readme.height=58
|
||||
readme.name=@README
|
||||
readme.width=47
|
||||
readme.x=10
|
||||
readme.y=10
|
||||
target1.height=50
|
||||
target1.name=Eintrag
|
||||
target1.showInterface=false
|
||||
target1.type=InterfaceTarget
|
||||
target1.width=80
|
||||
target1.x=270
|
||||
target1.y=320
|
||||
target2.height=50
|
||||
target2.name=Kandidatenmenge
|
||||
target2.showInterface=false
|
||||
target2.type=ClassTarget
|
||||
target2.width=140
|
||||
target2.x=160
|
||||
target2.y=440
|
||||
target3.height=50
|
||||
target3.name=SudokuGitter
|
||||
target3.showInterface=false
|
||||
target3.type=ClassTarget
|
||||
target3.width=110
|
||||
target3.x=480
|
||||
target3.y=260
|
||||
target4.height=50
|
||||
target4.name=Set
|
||||
target4.showInterface=false
|
||||
target4.type=AbstractTarget
|
||||
target4.width=80
|
||||
target4.x=20
|
||||
target4.y=310
|
||||
target5.height=50
|
||||
target5.name=SudokuFrame
|
||||
target5.showInterface=false
|
||||
target5.type=ClassTarget
|
||||
target5.width=110
|
||||
target5.x=330
|
||||
target5.y=50
|
||||
target6.height=50
|
||||
target6.name=SudokuRaetselDB
|
||||
target6.showInterface=false
|
||||
target6.type=ClassTarget
|
||||
target6.width=130
|
||||
target6.x=560
|
||||
target6.y=150
|
||||
target7.height=50
|
||||
target7.name=SudokuPanel
|
||||
target7.showInterface=false
|
||||
target7.type=ClassTarget
|
||||
target7.width=110
|
||||
target7.x=40
|
||||
target7.y=120
|
||||
target8.height=50
|
||||
target8.name=BekannteZahl
|
||||
target8.showInterface=false
|
||||
target8.type=ClassTarget
|
||||
target8.width=110
|
||||
target8.x=370
|
||||
target8.y=440
|
||||
target9.height=50
|
||||
target9.name=BitSet
|
||||
target9.showInterface=false
|
||||
target9.type=ClassTarget
|
||||
target9.width=80
|
||||
target9.x=20
|
||||
target9.y=390
|
||||
11
Quellcodes/Alg_DS_Sudoku/readme.adoc
Normal file
11
Quellcodes/Alg_DS_Sudoku/readme.adoc
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
= Material :
|
||||
|
||||
|===
|
||||
|Zuordnung|
|
||||
|Klassenstufe|
|
||||
|Bildungsplanbezug |
|
||||
|Werkzeug|
|
||||
|Autoren|
|
||||
|===
|
||||
|
||||
== Inhalt
|
||||
Loading…
Add table
Add a link
Reference in a new issue