No3x
Mitglied
Hallo, ich bin grad dabei einen Sudoku-Löser [C] zu schreiben, leider harkt es an der Stelle an der geprüft werden soll ob die Zahl in der Zeile schon vorhanden ist.
Das Problem liegt hauptsächlich bei Zeile 74-86.
PasteBin.de
Ist mit Xcode geschrieben.
Kann mir jemand einen Tipp geben, wie ich am besten die Zeile prüfen kann, bevor die Zufallszahl eingesetzt wird?
btw:Bisher prüfe ich nur die Zeilen ob sie 45 ergeben, später dann auch die Spalten. Außerdem möchte ich es später ohne Brute-Force, mit mehr Logik, erledigen.
Das Problem liegt hauptsächlich bei Zeile 74-86.
PasteBin.de
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int sudokuMatrix[9][9] = {
{ 1, 3, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 9, 5, 0, 0, 0 },
{ 0, 9, 8, 0, 0, 0, 0, 6, 0 },
{ 8, 0, 0, 0, 6, 0, 0, 0, 0 },
{ 4, 0, 0, 0, 0, 3, 0, 0, 1 },
{ 0, 0, 0, 0, 2, 0, 0, 0, 0 },
{ 0, 6, 0, 0, 0, 0, 2, 8, 0 },
{ 0, 0, 0, 4, 1, 9, 0, 0, 5 },
{ 0, 0, 0, 0, 0, 0, 0, 7, 0 }
};
int sudokuMatrix_compare[9][9] = {
{ 1, 3, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 9, 5, 0, 0, 0 },
{ 0, 9, 8, 0, 0, 0, 0, 6, 0 },
{ 8, 0, 0, 0, 6, 0, 0, 0, 0 },
{ 4, 0, 0, 0, 0, 3, 0, 0, 1 },
{ 0, 0, 0, 0, 2, 0, 0, 0, 0 },
{ 0, 6, 0, 0, 0, 0, 2, 8, 0 },
{ 0, 0, 0, 4, 1, 9, 0, 0, 5 },
{ 0, 0, 0, 0, 0, 0, 0, 7, 0 }
};
int zufallszahl;
int counter = 0;
int counter_ergebnis[9][2];
int i, j, k = 0;
int ergebnis = 0;
int counter_ergebnis_check = 0;
int runs = 0;
void print_matrix () {
for (i = 0; i != 9; ++i)
{
for (j = 0; j != 9; ++j){
printf("%d\t", sudokuMatrix[i][j]);
}
printf("\n\n");
}
}
int new_zufallszahl() {
srand(time(NULL));
return rand()%9+1;
}
int main (int argc, const char * argv[]) {
srand(time(NULL));
print_matrix();
while (ergebnis != 1 | runs != 2) {
//1. Zufällige Zahlen einsetzen
for (i = 0; i < 9; ++i)
{//Zeile
for (j = 0; j < 9; ++j)
{//Spalte
printf("Weiter mit beliebiger Taste\n");
int c = getchar();
//Prüfen ob zu bearbeitende Zahl keine Ausgangszahl ist
if(sudokuMatrix_compare[i][j] == 0) {
printf("Target: sudokuMatrix[%d][%d], da Inhalt = %d oder unpassende Zahl\n", i, j, sudokuMatrix[i][j]);
//Zufallszahl erzeugen
zufallszahl = new_zufallszahl();
for (k = 0; k < 9; ++k)
{//Alle Spalten der Zeile prüfen, ob Zufallszahl schon in dieser Zeile vergeben ist
if (sudokuMatrix[i][k] == zufallszahl) {
printf("Zufallszahl %d in sudokuMatrix[%d][%d] schon vorhanden!\n", zufallszahl, i, j);
zufallszahl = new_zufallszahl();
} else {
//Aktuelle Stelle mit generierter Zufallszahl belegen
sudokuMatrix[i][j] = zufallszahl;
printf("sudokuMatrix[%d][%d] ist nun geandert zu %d\n", i, j, zufallszahl);
srand(time(NULL));
zufallszahl = new_zufallszahl();
}
print_matrix();
}
} else {
printf("no Target: sudokuMatrix[%d][%d], da Inhalt = vorgegebene Zahl %d\n", i, j, sudokuMatrix[i][j]);
}
}
printf("\n\n");
//Aktuelle Lösung ausgeben
print_matrix();
}
//2. Prüfen ob die Summe jeder Zeile 45 ergibt
for (i = 0; i != 9; i++)
{
int counter = 0;
for (j = 0; j != 9; ++j) {
counter += sudokuMatrix[i][j];
}
if (counter != 45) {
counter_ergebnis[i][j] = 0;
printf("Brute Force in %d(+1). Zeile fehlgeschlagen\n", i);
} else if (counter == 45) {
counter_ergebnis[i][j] = 1;
printf("Brute Force in %d(+1). Zeile erfolgreich\n", i);
}
printf("Die Summe der Spalten der Zeile %d(+1) ergab %d\n\n", i, counter);
}
//3. Ergebnis
counter_ergebnis_check = 0;
for (i = 0; i != 9; ++i)
{
for (j = 0; j != 9; j++)
{
printf("%d", counter_ergebnis[i][j]);
if(counter_ergebnis[i][j] == 1) {
counter_ergebnis_check++;
}
}
printf("\n\n");
}
if (counter_ergebnis_check == 9) {
printf("Erfolgreich geloest.\n");
print_matrix();
ergebnis = 1;
} else {
printf("Counter bei %d\n", counter_ergebnis_check);
}
runs++;
}
}
Kann mir jemand einen Tipp geben, wie ich am besten die Zeile prüfen kann, bevor die Zufallszahl eingesetzt wird?
btw:Bisher prüfe ich nur die Zeilen ob sie 45 ergeben, später dann auch die Spalten. Außerdem möchte ich es später ohne Brute-Force, mit mehr Logik, erledigen.