Code:
package Haupt;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import Fenster.Fenster;
import Tools.Tools;
import Zeitmesser.Zeitmesser;
public class Sudoku {
List<Koordinaten>nullstellen=new ArrayList<Koordinaten>();
int [][]matrix; //Hauptmatrix
int zeilen,spalten;//Größe Hauptmatrix
static int aufrufe=0;
List<Integer> letzte_zahl=new ArrayList<Integer>();
Sudoku(int [][]matrix){
this.matrix=new int[9][9];
zeilen=9;spalten=9;
for(int i=0;i<zeilen;i++)
for(int j=0;j<spalten;j++){
this.matrix[i][j]=matrix[i][j];
if(this.matrix[i][j]==0)nullstellen.add(new Koordinaten(i,j));
}
}
boolean primus(int pos) {
final int x=nullstellen.get(pos).get_x(),y=nullstellen.get(pos).get_y();
final int m=Tools.get_kl_matrix_aus_Matrix(3, 3, 9, 9, x+1, y+1);
final int start_kx=Tools.get_zeile_aus_Matrix(3, 3, 1, 1, m+1, 9, 9);
final int start_ky=Tools.get_spalte_aus_Matrix(3, 3, 1, 1, m+1, 9, 9);
int zahl=0;
aufrufe++;
do {
do {
zahl++;
if(zahl>9) {
matrix[x][y]=0;
return false;
}
}while(prüfe_zahl(x,y,m,zahl, start_kx, start_ky));
matrix[x][y]=zahl;
if(pos==nullstellen.size()-1) {
return true;
}
}while(!primus(pos+1));
return true;
}
boolean prüfe_zahl(int x, int y, int m, int zahl, int start_kx, int start_ky) {
if (prüfen_zeile(zahl,x))return true;
if(prüfen_spalte(zahl,y))return true;
if(prüfen_matrix(zahl, start_kx, start_ky))return true;
return false;
}
boolean prüfen_zeile(int zahl, int x){
for (int i=0;i<9;i++)
if(matrix[x][i]==zahl)return true;
return false;
}
boolean prüfen_spalte(int zahl, int y){
for (int i=0;i<9;i++)
if(matrix[i][y]==zahl)return true;
return false;
}
boolean prüfen_matrix(int zahl, int kx, int ky){
for (int i=kx;i<3+kx;i++)
for(int j=ky;j<3+ky;j++)
if(matrix[i][j]==zahl)return true;
return false;
}
/*
* gibt den wert der Hauptmatrix an Stelle zeile, spalte zurück
*/
int get_matrix(int zeile, int spalte){
return matrix[zeile][spalte];
}
class Koordinaten{
int x=0;
int y=0;
Koordinaten(int x, int y){
set_Koordinaten(x,y);
}
int get_x() {
return x;
}
int get_y() {
return y;
}
boolean gleich(Koordinaten a) {
if(this.x==a.get_x()&&this.y==a.get_y())return true;
else return false;
}
void set_Koordinaten(int x, int y) {
this.x=x;
this.y=y;
}
}
}
class Mainframe{
public static void main(String[] args) {
int [][]matrix={{0,0,2,0,7,0,9,4,0},
{9,0,1,0,0,0,0,0,0},
{0,7,3,9,8,0,0,0,6},
{0,0,4,5,0,7,0,0,8},
{6,3,0,0,9,0,0,0,0},
{0,0,0,1,0,0,3,0,0},
{0,9,0,4,5,6,0,7,3},
{0,0,0,0,0,0,0,8,1},
{0,0,0,0,1,3,0,0,0}};
Fenster b=new Fenster();
boolean initialisiert=false, laden=false, gelöst=false;
int x=0, y=0, y1=0;
b.set_text();
while(!initialisiert&&!laden){
initialisiert=b.get_fertig();
laden=b.get_laden();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(initialisiert){
for(int i=0;i<9;i++){
switch(i){
case 0:case 1:case 2:
switch(i){
case 0:
x=0;y=0;y1=y;
break;
case 1:
x=0;
y=3;y1=y;
break;
case 2:
x=0;
y=6;y1=y;
break;
}
break;
case 3:case 4: case 5:
switch(i){
case 3:
x=3;
y=0;y1=y;
break;
case 4:
x=3;
y=3;y1=y;
break;
case 5:
x=3;
y=6;y1=y;
break;
}
break;
case 6: case 7: case 8:
switch(i){
case 6:
x=6;
y=0;y1=y;
break;
case 7:
x=6;
y=3;y1=y;
break;
case 8:
x=6;
y=6;y1=y;
break;
}
break;
}
for(int j=0;j<3;j++){
for (int k=0;k<3;k++){
matrix[x][y1++]=b.get_matrix(i, j, k);
}
x++;y1=y;
}
}
FileWriter writer;
File datei=new File("Sodoku.txt");
try {
writer=new FileWriter(datei);
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
writer.write(Integer.toString(matrix[i][j]));
}
writer.write(System.getProperty("line.separator"));
}
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("Fehler beim Speichern");
}
}//end initialisiert -> Zahlen vom Eingabefenster
if(laden){
//System.out.println("Versuche zu laden");
FileReader reader;
File datei=new File("Sodoku.txt");
int zahl;
int i=0;int j=0;
try {
reader=new FileReader(datei);
try {
while( (zahl=reader.read()) != -1 ){
if((char)zahl!=13 &&(char)zahl!=10){//13=return 10=neue Zeile
matrix[i][j++]=Character.getNumericValue((char)zahl);
if(j==9){
i++;
j=0;
}
if(i==9)i=0;
}
}
reader.close();
//System.out.println("Laden ok");
} catch (IOException e) {
e.printStackTrace();
System.out.println("Fehler beim Datei auslesen");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Datei nicht gefunden.");
}
x=0;y=-1;
int xg,yg;
for(i=0;i<9;i++) {
for(j=0;j<9;j++) {
y++;
if(y==3) {
x++;
y=0;
}
xg=Tools.get_zeile_aus_Matrix(3, 3, x+1, y+1, i+1, 9, 9);
yg=Tools.get_spalte_aus_Matrix(3, 3, x+1, y+1, i+1, 9, 9);
b.set_button(i, j, Integer.toString(matrix[xg][yg]));
}
x=0;
y=-1;
}
}//end laden -> Zahlen aus Datei
Sudoku a=new Sudoku(matrix);
Zeitmesser.startZeitmessung(1,2);
for(int i=0; i<1000; i++) {
a=new Sudoku(matrix);
gelöst=a.primus(0);}
long zeit=Zeitmesser.getZeitmessung(1)/1000;
Zeitmesser.stopZeitmessung(1);
System.out.println();System.out.println();
for (int i=0;i<a.zeilen;i++)
{
for (int j=0;j<a.spalten;j++)System.out.print(a.get_matrix(i, j)+" ");
System.out.println();
}
System.out.println();
x=0;y=-1;
int xg,yg;
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
y++;
if(y==3) {
x++;
y=0;
}
xg=Tools.get_zeile_aus_Matrix(3, 3, x+1, y+1, i+1, 9, 9);
yg=Tools.get_spalte_aus_Matrix(3, 3, x+1, y+1, i+1, 9, 9);
b.set_button(i, j, Integer.toString(a.get_matrix(xg,yg)));
}
x=0;
y=-1;
}
System.out.println();
System.out.println("Aufrufe = "+a.aufrufe);
System.out.println("Primus liefert = "+gelöst);
System.out.println("Gebraucht: "+zeit/1000.+ " Microsekunden");
}
}