|
|
@ -41,6 +41,7 @@ typedef struct sudoku {
|
|
|
|
int s_einlesen(char*, sudoku*); /* Einlesen aus Datei */
|
|
|
|
int s_einlesen(char*, sudoku*); /* Einlesen aus Datei */
|
|
|
|
void s_ausgabe(sudoku*,int); /* Auf dem bildschirm ausgeben */
|
|
|
|
void s_ausgabe(sudoku*,int); /* Auf dem bildschirm ausgeben */
|
|
|
|
void s_ausgabe_unicode(sudoku*,int); /* Auf dem bildschirm ausgeben, Unicode Rahmenelemente */
|
|
|
|
void s_ausgabe_unicode(sudoku*,int); /* Auf dem bildschirm ausgeben, Unicode Rahmenelemente */
|
|
|
|
|
|
|
|
void s_plain(sudoku*); /* Plaintext (wie eingabe-datei) */
|
|
|
|
void print_help(int,char**); /* "Hilfe" ausgeben */
|
|
|
|
void print_help(int,char**); /* "Hilfe" ausgeben */
|
|
|
|
/* Loeserfunktionen */
|
|
|
|
/* Loeserfunktionen */
|
|
|
|
/* Funktion fuer Backtracking */
|
|
|
|
/* Funktion fuer Backtracking */
|
|
|
@ -60,10 +61,13 @@ const int OUTPUT_COLOR=1;
|
|
|
|
const int OUTPUT_COLOR=0;
|
|
|
|
const int OUTPUT_COLOR=0;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Ausgabe unterdrücken */
|
|
|
|
|
|
|
|
int silent = 0;
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
sudoku s={ {{0}}, {{0}}, {{{1}}}, 81 };
|
|
|
|
sudoku s={ {{0}}, {{0}}, {{{1}}}, 81 };
|
|
|
|
char* outfile = NULL;
|
|
|
|
char* outfile = NULL;
|
|
|
|
int st=0,sl=0,ret=0;
|
|
|
|
int st=0,sl=0,ret=0,plain=0;
|
|
|
|
int c,unicode=0,color=0,outfilev=0,solve=1;
|
|
|
|
int c,unicode=0,color=0,outfilev=0,solve=1;
|
|
|
|
#ifdef linux
|
|
|
|
#ifdef linux
|
|
|
|
struct timespec ts,te,l_ts,l_te;
|
|
|
|
struct timespec ts,te,l_ts,l_te;
|
|
|
@ -72,7 +76,7 @@ int main(int argc, char **argv) {
|
|
|
|
color = 1;
|
|
|
|
color = 1;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/* Argumente auslesen */
|
|
|
|
/* Argumente auslesen */
|
|
|
|
while ((c = getopt (argc, argv, "cho:uUn")) != -1)
|
|
|
|
while ((c = getopt (argc, argv, "cho:uUnsp")) != -1)
|
|
|
|
switch(c) {
|
|
|
|
switch(c) {
|
|
|
|
case 'h':
|
|
|
|
case 'h':
|
|
|
|
print_help(argc,argv);
|
|
|
|
print_help(argc,argv);
|
|
|
@ -92,6 +96,12 @@ int main(int argc, char **argv) {
|
|
|
|
case 'n':
|
|
|
|
case 'n':
|
|
|
|
solve = 0;
|
|
|
|
solve = 0;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 's':
|
|
|
|
|
|
|
|
silent = 1;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'p':
|
|
|
|
|
|
|
|
plain = 1;
|
|
|
|
|
|
|
|
break;
|
|
|
|
case '?':
|
|
|
|
case '?':
|
|
|
|
if (optopt == 'c')
|
|
|
|
if (optopt == 'c')
|
|
|
|
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
|
|
|
|
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
|
|
|
@ -116,47 +126,63 @@ int main(int argc, char **argv) {
|
|
|
|
if(outfilev) s_write_error( outfile ,1 );
|
|
|
|
if(outfilev) s_write_error( outfile ,1 );
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* falls nicht gelöst werden soll: */
|
|
|
|
if(solve == 0) {
|
|
|
|
if(solve == 0) {
|
|
|
|
(unicode == 1) ? s_ausgabe_unicode(&s,color) : s_ausgabe(&s,color);
|
|
|
|
if(unicode == 1) {
|
|
|
|
|
|
|
|
s_ausgabe_unicode(&s,color);
|
|
|
|
|
|
|
|
}else if(plain == 1) {
|
|
|
|
|
|
|
|
s_plain(&s);
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
s_ausgabe(&s,color);
|
|
|
|
|
|
|
|
}
|
|
|
|
exit(0);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* Sudoku Loesen, Loseung ausgeben und in Datei schreiben */
|
|
|
|
/* Sudoku Loesen, Loseung ausgeben und in Datei schreiben */
|
|
|
|
printf("Suche...\nProbiere es mit Logik... ");
|
|
|
|
if(!silent) printf("Suche...\nProbiere es mit Logik... ");
|
|
|
|
#ifdef linux
|
|
|
|
#ifdef linux
|
|
|
|
clock_gettime(CLOCK_REALTIME, &l_ts);
|
|
|
|
clock_gettime(CLOCK_REALTIME, &l_ts);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
sl = sl_loes(&s);
|
|
|
|
sl = sl_loes(&s);
|
|
|
|
if(sl != 1) {
|
|
|
|
if(sl != 1) {
|
|
|
|
printf("FAIL\nNun mit Backtracking... ");
|
|
|
|
if(!silent) printf("FAIL\nNun mit Backtracking... ");
|
|
|
|
sl = s_loes_track(&s,0);
|
|
|
|
sl = s_loes_track(&s,0);
|
|
|
|
printf("%s\n",(sl != 1 ? "FAIL" : "OK" ));
|
|
|
|
if(!silent) printf("%s\n",(sl != 1 ? "FAIL" : "OK" ));
|
|
|
|
}else{
|
|
|
|
}else{
|
|
|
|
printf("OK\n");
|
|
|
|
if(!silent) printf("OK\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef linux
|
|
|
|
#ifdef linux
|
|
|
|
clock_gettime(CLOCK_REALTIME, &l_te);
|
|
|
|
clock_gettime(CLOCK_REALTIME, &l_te);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
if(sl == 0) {
|
|
|
|
if(sl == 0) {
|
|
|
|
if(color)
|
|
|
|
if(color)
|
|
|
|
printf("\033[31;1mDas Sudoku ist nicht loesbar!!\033[0m\n");
|
|
|
|
fprintf(stderr,"\033[31;1mDas Sudoku ist nicht loesbar!!\033[0m\n");
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fprintf(stderr,"Das Sudoku ist nicht loesbar!!\n");
|
|
|
|
fprintf(stderr,"Das Sudoku ist nicht loesbar!!\n");
|
|
|
|
if(outfilev) s_write_error( outfile , 2 );
|
|
|
|
if(outfilev) s_write_error( outfile , 2 );
|
|
|
|
ret = 1;
|
|
|
|
ret = 1;
|
|
|
|
}else{
|
|
|
|
}else{
|
|
|
|
if(color)
|
|
|
|
if(color) {
|
|
|
|
printf("\033[32;1mLoesung gefunden:\033[0m\n\n");
|
|
|
|
if(!silent) printf("\033[32;1mLoesung gefunden:\033[0m\n\n");
|
|
|
|
else
|
|
|
|
}else{
|
|
|
|
printf("Loesung gefunden:\n\n");
|
|
|
|
if(!silent) printf("Loesung gefunden:\n\n");
|
|
|
|
(unicode == 1) ? s_ausgabe_unicode(&s,color) : s_ausgabe(&s,color);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(unicode == 1) {
|
|
|
|
|
|
|
|
s_ausgabe_unicode(&s,color);
|
|
|
|
|
|
|
|
}else if(plain == 1) {
|
|
|
|
|
|
|
|
s_plain(&s);
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
s_ausgabe(&s,color);
|
|
|
|
|
|
|
|
}
|
|
|
|
if(outfilev) s_write( outfile ,&s );
|
|
|
|
if(outfilev) s_write( outfile ,&s );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef linux
|
|
|
|
#ifdef linux
|
|
|
|
|
|
|
|
if(!silent) {
|
|
|
|
clock_gettime(CLOCK_REALTIME, &te);
|
|
|
|
clock_gettime(CLOCK_REALTIME, &te);
|
|
|
|
t = (l_te.tv_sec + l_te.tv_nsec*0.000000001)-(l_ts.tv_sec + l_ts.tv_nsec*0.000000001);
|
|
|
|
t = (l_te.tv_sec + l_te.tv_nsec*0.000000001)-(l_ts.tv_sec + l_ts.tv_nsec*0.000000001);
|
|
|
|
printf("\nBenoetigte Zeit (loesen): %Lfs\n",t);
|
|
|
|
printf("\nBenoetigte Zeit (loesen): %Lfs\n",t);
|
|
|
|
t = (te.tv_sec + te.tv_nsec*0.000000001)-(ts.tv_sec + ts.tv_nsec*0.000000001);
|
|
|
|
t = (te.tv_sec + te.tv_nsec*0.000000001)-(ts.tv_sec + ts.tv_nsec*0.000000001);
|
|
|
|
printf("Benoetigte Zeit (gesamt): %Lfs\n",t);
|
|
|
|
printf("Benoetigte Zeit (gesamt): %Lfs\n",t);
|
|
|
|
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -217,6 +243,16 @@ int s_einlesen(char * path, sudoku * sf) {
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void s_plain(sudoku* s) {
|
|
|
|
|
|
|
|
int i,j;
|
|
|
|
|
|
|
|
for(i=0;i<9;i++) {
|
|
|
|
|
|
|
|
for(j=0;j<9;j++) {
|
|
|
|
|
|
|
|
printf("%d",s->feld[i][j]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void s_ausgabe(sudoku* s,int color) {
|
|
|
|
void s_ausgabe(sudoku* s,int color) {
|
|
|
|
int i,j;
|
|
|
|
int i,j;
|
|
|
|
for(i=0;i<9;i++) {
|
|
|
|
for(i=0;i<9;i++) {
|
|
|
@ -286,7 +322,9 @@ void print_help(int argc, char **argv) {
|
|
|
|
printf(" -h Diese Hilfe\n");
|
|
|
|
printf(" -h Diese Hilfe\n");
|
|
|
|
printf(" -o <file> Ausgabedatei\n");
|
|
|
|
printf(" -o <file> Ausgabedatei\n");
|
|
|
|
printf(" -c Keine Farbe\n");
|
|
|
|
printf(" -c Keine Farbe\n");
|
|
|
|
|
|
|
|
printf(" -p Plaintext\n");
|
|
|
|
printf(" -n Nicht loesen, nur ausgeben\n");
|
|
|
|
printf(" -n Nicht loesen, nur ausgeben\n");
|
|
|
|
|
|
|
|
printf(" -s Nur die Lösung ausgeben\n");
|
|
|
|
printf("\033[0;1mAusgabe:\033[0m\n");
|
|
|
|
printf("\033[0;1mAusgabe:\033[0m\n");
|
|
|
|
printf(" \033[32;1mgruen:\033[0m Vorgegebene Werte\n");
|
|
|
|
printf(" \033[32;1mgruen:\033[0m Vorgegebene Werte\n");
|
|
|
|
printf(" \033[33;1mgelb:\033[0m Mit Logik gefundene Werte\n");
|
|
|
|
printf(" \033[33;1mgelb:\033[0m Mit Logik gefundene Werte\n");
|
|
|
@ -299,6 +337,8 @@ void print_help(int argc, char **argv) {
|
|
|
|
printf(" -U Unicode Rahmenelemente (Probleme unter Windows!)\n");
|
|
|
|
printf(" -U Unicode Rahmenelemente (Probleme unter Windows!)\n");
|
|
|
|
printf(" -h Diese Hilfe\n");
|
|
|
|
printf(" -h Diese Hilfe\n");
|
|
|
|
printf(" -o <file> Ausgabedatei\n");
|
|
|
|
printf(" -o <file> Ausgabedatei\n");
|
|
|
|
|
|
|
|
printf(" -p Plaintext\n");
|
|
|
|
|
|
|
|
printf(" -s Nur die Lösung ausgeben\n");
|
|
|
|
printf(" -n Nicht loesen, nur ausgeben\n");
|
|
|
|
printf(" -n Nicht loesen, nur ausgeben\n");
|
|
|
|
printf("By Thomas Battermann\n");
|
|
|
|
printf("By Thomas Battermann\n");
|
|
|
|
|
|
|
|
|
|
|
|