Dragonate
Erfahrenes Mitglied
So Leute ich hoffe jemand nimmt sich die Zeit hier mal drüber zuschaun.
Ich habe einen lösenden Sudoku Algorithmus geschrieben, wobei es sich nicht um eine professionelle Backtracking-Methode handelt, sondern um eine eher schlichte Brut-Force Methode, worauf ich aber als Hobby-Programmierer auch schon stolz bin!
Ich habe aber noch ein Problem, dass mein Sudoku-Prog nicht zum Ende kommt.
Woran es meiner Meinung nach dran liegen kann :
Entweder :
Prog hängt in einer Endlosschleife
Oder :
Durch die Brut-Force(Ausprobieren-Methode) findet mein Code die Lösung einfach nicht, was ich mir aber trotz der schlichten Methode bei meiner CPU-Power nicht ganz vorstellen kann.
Jetzt der Code!:
Noch Nennenswerte Fakten um meinen Code besser zu verstehen :
-Eingabe der vorgegebenen Zahlen sowie Nichtberührung der vorgegebenen funktioniert !
-falls jemand nicht genau weis was mit dieser langen Bedingung los ist:
Diese sorgt dafür, das jeweils immer ein 9ner Blöckchen mit Zahlen befüllt wird, ohne das die vorgegebenen Zahlen berührt werden, funktioniert auch Einwandfrei, alles getestet!
-Alles wichtige spielt sich in der GROSSEN WHILE - SCHLEIFE ab (Auch der Sudoku-Kontroll-Part ist befindet sich noch in dieser).
Und nur bedingt durch diese While-Schleife könnte eine Endlosschleife entstehen.
Abbruchkriterium ist die Variable "fertig" !
Ok ich hoffe einer weis woran es liegt (wiegesagt das Programm rechnet, kommt nicht zum ende).
Ich habe einen lösenden Sudoku Algorithmus geschrieben, wobei es sich nicht um eine professionelle Backtracking-Methode handelt, sondern um eine eher schlichte Brut-Force Methode, worauf ich aber als Hobby-Programmierer auch schon stolz bin!
Ich habe aber noch ein Problem, dass mein Sudoku-Prog nicht zum Ende kommt.
Woran es meiner Meinung nach dran liegen kann :
Entweder :
Prog hängt in einer Endlosschleife
Oder :
Durch die Brut-Force(Ausprobieren-Methode) findet mein Code die Lösung einfach nicht, was ich mir aber trotz der schlichten Methode bei meiner CPU-Power nicht ganz vorstellen kann.
Jetzt der Code!:
Code:
int main(void)
{
int sudoku[9][9], sperre[9][9], pool[9][9];
int zahl, spalte, zeile, anzahl, zz, zz1, zz2;
int i, j, k, o, p, ok=0;
long int count=0;
int check=0, fertig=0, incr1=0, incr2=0, incr3=0, incr4=0, grenze1=3, grenze2=3;
//----------------------------------------------------------------------------
// Initialisierung der Arrays;
//----------------------------------------------------------------------------
for(i=0;i<9;i++){
for(j=0;j<9;j++){
sudoku[i][j]=0;
sperre[i][j]=0;
pool[i][j]=0;
}
}
printf("Wieviele Zahlen sind vorgegeben?\n\n");
scanf("%d", &anzahl);
fflush(stdin);
//----------------------------------------------------------------------------
// Eingabe der vorgegebenen Zahlen;
//----------------------------------------------------------------------------
for(i=0;i<anzahl;i++){
printf("%dte Zahl\n\n", (i+1));
scanf("%d,%d,%d", &zahl, &spalte, &zeile);
fflush(stdin);
sudoku[spalte-1][zeile-1]=zahl;
sperre[spalte-1][zeile-1]=zahl;
pool[spalte-1][zeile-1]=zahl;
}
//----------------------------------------------------------------------------
// Befüllung der Arrays durch Zufallszahlen;
// Vorgegebende Zahlen werden dabei nicht berührt;
//----------------------------------------------------------------------------
srand(time(0));
while(fertig!=1){
for(k=0;k<9;k++){
for(i=incr1;i<grenze1;i++){
for(j=incr2;j<grenze2;j++){
if(sperre[j][i]==0){
while(ok==0){
zz=rand()%9+1;
if((zz==sudoku[incr3][incr4]) || (zz==sudoku[incr3][incr4+1]) || (zz==sudoku[incr3][incr4+2]) || (zz==sudoku[incr3+1][incr4]) || (zz==sudoku[incr3+1][incr4+1]) || (zz==sudoku[incr3+1][incr4+2]) || (zz==sudoku[incr3+2][incr4]) || (zz==sudoku[incr3+2][incr4+1]) || (zz==sudoku[incr3+2][incr4+2])){
ok=0;
}
else{
sudoku[j][i]=zz;
ok=1;
}
}
ok=0;
}
}
}
if(k==0||k==1||k==3||k==4||k==6||k==7){
incr2+=3;
grenze2+=3;
incr3+=3;
}
else if(k==2||k==5){
incr2=0;
grenze2=3;
incr3=0;
incr1+=3;
grenze1+=3;
incr4+=3;
}
}
//----------------------------------------------------------------------------
// Kontrolle ob Sudoku gelöst ist;
//----------------------------------------------------------------------------
for(o=0;o<9;o++){
for(p=0;p<9;p++){
check+=sudoku[o][p];
}
if(check!=45){
check=0;
fertig=0;
break;
}
else{
fertig=1;
check=0;
}
}
count++;
}
//----------------------------------------------------------------------------
// Ausgabe des hoffentlich gelösten Sudokus;
//----------------------------------------------------------------------------
printf("\n");
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("| %d ", sudoku[j][i]);
}
printf("\n\n");
}
printf("\n");
printf("\n%d", count);
system("PAUSE");
return 0;
}
Noch Nennenswerte Fakten um meinen Code besser zu verstehen :
-Eingabe der vorgegebenen Zahlen sowie Nichtberührung der vorgegebenen funktioniert !
-falls jemand nicht genau weis was mit dieser langen Bedingung los ist:
Code:
if((zz==sudoku[incr3][incr4]) || (zz==sudoku[incr3][incr4+1]) || (zz==sudoku[incr3][incr4+2]) || (zz==sudoku[incr3+1][incr4]) || (zz==sudoku[incr3+1][incr4+1]) || (zz==sudoku[incr3+1][incr4+2]) || (zz==sudoku[incr3+2][incr4]) || (zz==sudoku[incr3+2][incr4+1]) || (zz==sudoku[incr3+2][incr4+2])){
-Alles wichtige spielt sich in der GROSSEN WHILE - SCHLEIFE ab (Auch der Sudoku-Kontroll-Part ist befindet sich noch in dieser).
Und nur bedingt durch diese While-Schleife könnte eine Endlosschleife entstehen.
Abbruchkriterium ist die Variable "fertig" !
Ok ich hoffe einer weis woran es liegt (wiegesagt das Programm rechnet, kommt nicht zum ende).