Sudoku Solver // habe probleme
-
Hallo an alle!
hab ein problem mit meinem sudoku löser..
hab die letzten paar tage ein bisschen was zusammegeschrieben,
aber es funktioniert nicht...
es gibt zwar schon viele threads zu diesem thema, jedoch möchte ich gerne meine eigene version zum laufen bekommen..ich weiss nicht ganz wie ich das mit dem auflösen zusammenbringen soll
der fehler liegt im main, und zwar bei aufraufen der check funktion bzw. bei der if-bedingung die auf 10 abfrägt.
wenn ein ungültiger wert entsteht, spring er eins zurück. Das macht er solange bis er wieder zum ursprung kommt, und anschließen noch weiter..hier noch ein test-sudoko das man in eine txt datei schreiben kann
000006000
028900607
639578000
500760100
700154060
201803400
007600030
002009000
000080000#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int rauslesen(FILE *datei, char **zahlen); int rauslesen(FILE *datei, char **zahlen) { char temp; int size=0, k=0; fseek(datei,0,SEEK_SET); while(!feof(datei)) { temp=fgetc(datei); zahlen[size]=(char *)realloc(zahlen[size],sizeof(char)*(k+1)); zahlen[size][k]=temp; k++; zahlen[size][k]='\0'; if(temp==10) { size++; zahlen=(char **)realloc(zahlen,sizeof(char *)*(size+1)); zahlen[size]=(char *)malloc(sizeof(char)); k=0; } } return size; } void transformers2(char **data, int size); void transformers2(char **data, int size) { for(int ctp=0;ctp<size;ctp++) for(int ctp2=0;ctp2<size;ctp2++) data[ctp][ctp2]=data[ctp][ctp2]-48; } void display_sudoku(char **data, int size); void display_sudoku(char **data, int size) { for(int ctp=0;ctp<size;ctp++) { if((ctp)%3==0 && ctp>0) { printf("\n"); for(int k=0;k<size+6;k++) { if(k==4 || k==10) printf("%c",197); else printf("%c",196); } } for(int ctp2=0;ctp2<size;ctp2++) { if(ctp2==0) printf("\n"); if(ctp2%3==0 && ctp2>0) printf(" %c ",179); if(data[ctp][ctp2]==0) printf("%c",88); else printf("%d",data[ctp][ctp2]); } } printf("\n\n"); } bool check(char **data, int y, int x, int size); bool check(char **data, int y, int x, int size) { int temp=0; int spalten=x/3*3; int zeilen=y/3*3; // BLOCK for(int k=0;k<3;k++) { for(int i=0;i<3;i++) { if(data[y][x]==data[zeilen+k][spalten+i]) temp++; if(temp>1) return false; } } temp=0; // HORIZONTAL for(int ctp=0;ctp<size;ctp++) { if(data[y][x]==data[y][ctp]) temp++; if(temp>1) return false; } temp=0; // VERTIKAL for(int ctp=0;ctp<size;ctp++) { if(data[y][x]==data[ctp][x]) temp++; if(temp>1) return false; } temp=0; return true; } bool solver(char **data, int size, int position); bool solver(char **data, int size, int position) { return NULL; } void main() { int size=0; int wert=1; int merker=1; int temp=1; char **zahlen; FILE *datei; datei=fopen("su1.txt","r"); zahlen=(char **)malloc(sizeof(char *)); zahlen[0]=(char *)malloc(sizeof(char)); if(datei!=NULL) { size=rauslesen(datei,zahlen); transformers2(zahlen,size); display_sudoku(zahlen,size); for(int k=0;k<size;k++) { for(int i=0;i<size;i++) { if(wert==10) { int g; display_sudoku(zahlen,size); temp++; wert=zahlen[k][i-temp]; for(g=0;g<(temp+1);g++) zahlen[k][8-g]=0; display_sudoku(zahlen,size); i=i-(g+1); wert++; } if(zahlen[k][i]==0) { zahlen[k][i]=wert; display_sudoku(zahlen,size); if(check(zahlen,k,i,size)) { display_sudoku(zahlen,size); zahlen[k][i]=wert; wert=1; } else { zahlen[k][i]=0; display_sudoku(zahlen,size); i--; wert++; } } } } display_sudoku(zahlen,size); } else perror(""); free(zahlen); getch(); }
danke!
-
einfach mal nen debugger verwenden
-
das hat recht wenig mit c++ zutun genau genommen sieht das nach c aus
gehört also nicht hier rein
kleiner tipp du brauchst die prototypen nicht direkt vor der funktion deklarieren
wenn dann alle ganz an den anfang aber nach deinem aufbau brauchst du diese garnicht
und bei logig fehler oder generell bei fehler hielft der debuger
einfach den cod zeiel für zeile mim debuger durchgehen
-
Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.