Bitte um Hilfe bei Sudoku Programm
-
Hallo
Von der Uni aus sollen wir ein Sudoku Solver schreiben, viel quelltext ist schon vorgegeben, aber leider nicht alles. Ich gebe euch mal vor, was vorgebenen ist, dazukommen sollen die Teile bei den // ** INSERT ** // und die funktionen korrekt und weiter
Leider habe ich gar keinen plan, wie das gehen soll
#include <stdio.h> struct sud { char mat[9][9][10]; // m[i][j][k] Feld Element // i = {0..8} Zeilen Index // j = {0..8} Spalten Index // // m[i][j][0] // := 0 : Feldwert offen // := {1..9}: Feldwert fest // // m :={1..9} // m[i][j][m] Feldwert // := 0 == m möglich // := 1 == m verboten char next[3]; // Test-Element-Parameter // next[0] := Zeile // next[1] := Spalte // next[2] := Wert }; typedef struct sud SUDOK; int start(SUDOK *res); void ausgabe(SUDOK *res); void ausschluss(SUDOK *res); int einzeln(SUDOK *res); int probe (SUDOK *alt); int weiter(SUDOK *neu); int korrekt(SUDOK *neu); // Hauptfunktion int main(void) { SUDOK res ={{0}}; int i,j; printf(" Willkommen zum Sudoku-Programm \n\n\n"); start(&res); printf(" __Originalmatrix: __"); ausgabe(&res); printf(" ^^Originalmatrix: ^^"); printf("\n\n\n "); for (i=0; i<9; i++) for (j=0; j<9; j++) { res.next[0] = i; res.next[1] = j; res.next[2] = res.mat[i][j][0]; ausschluss(&res); } ausgabe(&res); res.next[0]=res.next[1]=res.next[2] = 0; probe(&res); return(-100); } // Startwertfunktion: int start(SUDOK *res) //Vorgaben festlegen { char i,j; char vor[9][9] = { 0, 7, 0, 6, 0, 0, 0, 8, 0, 6, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 4, 0, 5, 0, 1, 2, 0, 0, 0, 0, 9, 6, 0, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 1, 0, 7, 2, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0 }; for (i=0; i<9; i++) for (j=0; j<9; j++) res->mat[i][j][0] = vor [i][j]; return(0); } // Ausgabe der Matrix void ausgabe(SUDOK *res) { char i,j; for (i=0; i<9; i++) { printf("\n "); if ((i==3)||(i==6)) printf("\n "); for(j=0; j<9; j++) { if ((j==3)||(j==6)) printf(" "); if (res->mat[i][j][0] != 0) printf("%2d",res->mat[i][j][0]); else printf(" ."); } } printf("\n"); return; } // Ausschluss-Funktion // Eindeutige Vorgaben löschen Möglichkeiten in // Zeile Spalte und Block void ausschluss(SUDOK *res) { char i, j, k, m, n, r, s; if (res->next[2] == 0) return; i = res->next[0]; j = res->next[1]; k = res->next[2]; for (m=0; m<9; m++) // Ausschluss Werte: Spalte res->mat[m][j][k] = 1; for (n=0; n<9; n++) // Ausschluss Werte: Zeile res->mat[i][n][k] = 1; r = i/3; s = j/3; for (m=0; m<3; m++) // Ausschluss Werte: Block for (n=0; n<3; n++) res->mat[m+r*3][n+s*3][k] = 1; for (m=1; m<10; m=m+1) res->mat[i][j][m] = 1; res->mat[i][j][k] = 0; res->mat[i][j][0] = k; return; } // Einzeln-Funktion // Diese Funktion sucht nach Feldern mit nur einer Möglichkeit // Das Feld Next bekommt diese Werte übergeben // Bei Negativ endet sie mit 0 int einzeln(SUDOK *res) { int i, j, k, kneu, n; for (i=0; i<9; i++) { for (j=0; j<9; j++) { if(res->mat[i][j][0]) continue; n=0; for (k=1; k<10; k++) { if(res->mat[i][j][k]==0) { n = n+1; kneu = k; } } if (n==1) { res->next[0] = i; res->next[1] = j; res->next[2] = kneu; return(1); } } } return(0); } int probe (SUDOK *alt) { SUDOK neu; char i,ip, j,jp, k,kp, korr =-1; static int s =0; i = alt->next[0]; j = alt->next[1]; k = alt->next[2]; neu = *alt; printf(" %d %d %d ", i,j,k); ip=jp=0; do{ // INSERT // { do { ausschluss(&neu); } while (einzeln(&neu)); // INSERT // } } if (ip || kp || jp ) korr = korrekt(&neu); if (korr > 0) { printf(" Lösung gefunden!!!"); //Lösung richtig ausgabe(&neu); break; } if (korr < 0) { neu = *alt; if( (weiter(&neu) == 0) || (i != neu.next[0]) || (j != neu.next[1])) break; k = alt->next[2] = neu.next[2]; continue; } do { if( weiter(&neu) == 0) return(s); } while (i == neu.next[0] && j == neu.next[1]); probe(&neu); neu = *alt; if (weiter(&neu) == 0) return(s); k = alt->next[2] = neu.next[2]; } while ( (i == neu.next[0]) && (j == neu.next[1])); return(s); }Wäre super wenn ihr mir sagen könntet wie ich den Quelltext vervollständigen kann, damit das Programm läuft.
Vielen Dank
-
wozu gehst du zur uni, wenn du nix tun willst?
-
Hallo
sollen wir jetzt raten oder auswürfeln was da noch fehlt? Wo sind deine Anfänge/Vermutungen? Wir machen hier für dich nicht Hausaufgaben, wir geben dir nur Hilfe zur Felbsthilfe. Und da du auch nichts C++ spezifisches gepostet hast wirst du sicher auch erstmal ins Ansi-C Forum verschoben.
bis bald
akari
-
hmm..nette antwort danke
1. studiere ich kein informatik, es ist also nur ein nebenfach was wir belegen müssen
2. sitze ich seit mehreren tagen daran, und versuche auf des rätsels lösung zu kommenund last but not least 3.
Hilft mir deine Antwort leider kein bißchen
-
Tja Vermutung:
Also im Grunde siehts so aus: Der Teil der Fehlt sieht so aus das ein element was noch möglich wäre genommen wird, und dann wird durchprobiert, und dann wieder eins genommen und so weiter.
und wenn das nicht klappt, stellt man alles auf anfang zurück und versucht es mit anderen wertendie weiterfunktion gibt dabei "wahrscheinlich" an mit welchem element weiter gemacht wird, bzw ob noch möglichkeiten vorhanden sind
die korrekt funktion schaut nach ob das vollständig eingetragene sudoku korrekt ist ob es fehler gibt
in der theroie ist es mir also bekannt aber ich kriegs nicht hin
-
McSeth schrieb:
1. studiere ich kein informatik, es ist also nur ein nebenfach was wir belegen müssen
was du hier schreibst hört sich eher nach null plan von garnix und null bock an. ihr bekommt sicher nicht so eine aufgabe ohne vorbereitung.
2. sitze ich seit mehreren tagen daran, und versuche auf des rätsels lösung zu kommen
dann zeig doch mal, was du schon versucht hat.
-
McSeth schrieb:
1. studiere ich kein informatik, es ist also nur ein nebenfach was wir belegen müssen
Mein Beileid. Wer hätte denn auch ahnen können, dass man für die Leistungsnachweise im Nebenfach Leistung erbringen muss?!

-
Hallo,
ich habe das gleiche problem mit dem sudoku programm.
@McSeth: hast du schon ne lösung dazu? und du studierst nicht zufällig in brandenburg?cu Paul12
-
knarz schrieb:
McSeth schrieb:
1. studiere ich kein informatik, es ist also nur ein nebenfach was wir belegen müssen
was du hier schreibst hört sich eher nach null plan von garnix und null bock an. ihr bekommt sicher nicht so eine aufgabe ohne vorbereitung.
Nur noch so nebenbei: Eine Aufgabenstellung an ner Uni gibts immer OHNE vorbereitung dazu...
da gibts das nächste Übungsblatt, meistens noch nichtmal persönlich ausgeteilt, sondern steht auf de internetseite, hat mit der aktuellen Vorlesung gar nichts zu tun, und es einzigst was man dazu weiß ist.
"Deadline: ...."