blauerzettel
Grünschnabel
Hallo,
zuerst einmal entschuldige ich mich für mein Fauxpas mich in einem Forum anzumelden und direkt Fragen zu stellen. Der Grund dafür ist folgender...
Ich lerne zur Zeit C++ aus einem Buch (C++ für Spieleprogrammierer) obwohl ich das Buch noch nicht vollständig durchgelesen habe brennt es mir unter den Fingern ein spezielles Programm zu schreiben...
Dieses Programm soll in der Lage sein Sudokus selbstständig zu lösen.
Bisher konnte ich ohne Probleme ein mehrdimensionales Array erzeugen und in dieses meine Werte eintragen. Die eingetragene Werte (0-9, wobei 0 für ein noch leeres Feld steht) werden auch direkt auf ihre legalität überprüft, nun kommt allerdings der wichtigste Teil, man könnte es auch als "Herzstück" des Programmes bezeichnen. Das Programm soll nun selbstständig die fehlende Teile ersetzen, dazu möchte ich es erst das Array durchsuchen lassen und Felder in denen nur eine Möglichkeit zur Verfügung steht direkt ausfüllen lassen.
Sollte es dannach noch freie Felder geben so sollen diese mittels Brute-Force gelöst werden.
Doch Schritt für Schritt...
Wir stellen uns vor in einem 3x3 Feld großen Array (für Übungszwecke muss es ja nicht gleich das 9x9-Feld sein) wäre nur eine 0 eingegeben, das Array sieht also z.B. folgendermaßen aus:
123
406
789
Jetzt soll das Programm von selbst erkennen, welcher Wert sich in das freie Feld eintragen lässt, ich habe mir bereits darüber den Kopf zerbrochen komme allerdings auf keine anständige Lösung...
Sollte Quelltext vom bereits fertigen Teil gewünscht werden einfach schreiben
Ich hoffe ich habe meine Frage in einem verständlichen Deutsch geschrieben, als Schwabe muss ich zugeben habe ich ab und an meine Probleme mit "Hochdeutsch"
Ich würde mich über Hilfe wirklich freuen!
MFG: blauerzettel
Ich habe mich doch dazu durchgerungen euch einfach einmal den kompletten Quelltext anzugeben, wen es nicht interessiert der kann ja einfach weiterscrollen
Vielleicht kann mir ja auch der eine oder andere noch ein paar Tipps zu meinem Quellcode und zum sauberen Programmieren geben (das ist das erste mal das 3. Personen von mir geschriebenen Quellcode zu Gesicht bekommen).
Dadurch das ich bisher noch nicht sonderlich viel zu C++ gelernt habe wundert euch bitte nicht wenn einige Befehle komplizierter geschrieben sind als nötig.
So und nun der Quellcode:
Über Hilfe und konstruktive Kritik würde ich mich sehr freuen!
MFG: blauerzettel
zuerst einmal entschuldige ich mich für mein Fauxpas mich in einem Forum anzumelden und direkt Fragen zu stellen. Der Grund dafür ist folgender...
Ich lerne zur Zeit C++ aus einem Buch (C++ für Spieleprogrammierer) obwohl ich das Buch noch nicht vollständig durchgelesen habe brennt es mir unter den Fingern ein spezielles Programm zu schreiben...
Dieses Programm soll in der Lage sein Sudokus selbstständig zu lösen.
Bisher konnte ich ohne Probleme ein mehrdimensionales Array erzeugen und in dieses meine Werte eintragen. Die eingetragene Werte (0-9, wobei 0 für ein noch leeres Feld steht) werden auch direkt auf ihre legalität überprüft, nun kommt allerdings der wichtigste Teil, man könnte es auch als "Herzstück" des Programmes bezeichnen. Das Programm soll nun selbstständig die fehlende Teile ersetzen, dazu möchte ich es erst das Array durchsuchen lassen und Felder in denen nur eine Möglichkeit zur Verfügung steht direkt ausfüllen lassen.
Sollte es dannach noch freie Felder geben so sollen diese mittels Brute-Force gelöst werden.
Doch Schritt für Schritt...
Wir stellen uns vor in einem 3x3 Feld großen Array (für Übungszwecke muss es ja nicht gleich das 9x9-Feld sein) wäre nur eine 0 eingegeben, das Array sieht also z.B. folgendermaßen aus:
123
406
789
Jetzt soll das Programm von selbst erkennen, welcher Wert sich in das freie Feld eintragen lässt, ich habe mir bereits darüber den Kopf zerbrochen komme allerdings auf keine anständige Lösung...
Sollte Quelltext vom bereits fertigen Teil gewünscht werden einfach schreiben
Ich hoffe ich habe meine Frage in einem verständlichen Deutsch geschrieben, als Schwabe muss ich zugeben habe ich ab und an meine Probleme mit "Hochdeutsch"
Ich würde mich über Hilfe wirklich freuen!
MFG: blauerzettel
Ich habe mich doch dazu durchgerungen euch einfach einmal den kompletten Quelltext anzugeben, wen es nicht interessiert der kann ja einfach weiterscrollen
Vielleicht kann mir ja auch der eine oder andere noch ein paar Tipps zu meinem Quellcode und zum sauberen Programmieren geben (das ist das erste mal das 3. Personen von mir geschriebenen Quellcode zu Gesicht bekommen).
Dadurch das ich bisher noch nicht sonderlich viel zu C++ gelernt habe wundert euch bitte nicht wenn einige Befehle komplizierter geschrieben sind als nötig.
So und nun der Quellcode:
PHP:
/*
Sudokulöser Version 1.0
Autor: Tim Sottona
Start des Projektes: 21.12.2009
Vorraussichtliches Veröffentlichung: Zusammen mit Duke Nukem Forever :D
*/
#include <iostream>
using namespace std;
//Hauptprogramm
//
int main ()
{
//Konstanten
//
const int Breite = 3; //Breite eines Sudoku-Feldes
const int Hoehe = 3; //Höhe eines Sudoku-Feldes
//Variablen
//
int Feld [Breite] [Hoehe]; //Zweidimensionales Sudoku-Feld
int Eingabe = 1; //Benutzereingabe des Wertes des Feldes
int i=0, p=0, q=1, m, n, x, y; // Schleifenzähler
int xWert0;
int yWert0;
//Begrüssungstext
//
cout << "Willkommen!" << endl;
cout << "Dies ist der Sudokuloeser von blauerzettel V1.0" << endl;
//Weiter im Begrüssungstext
//
cout << "Das Programm wurde nun vollstaendig geladen!" << endl;
cout << "Wir werden erst eine kleine Initialisierung durchfuehren..." << endl;
cout << "hierbei wird ueberprueft ob das Programm alle Daten richtig geladen hat!" << endl;
cout << "Bedenken Sie beim eingeben der Werte das diese Zeile fuer Zeile eingegeben werden!" << endl;
cout << "Bitte geben Sie jetzt ihre Werte ein!" << endl;
//Sudoku-Feld mit Werten füllen + zzgl. Überprüfung der Werte auf Ihre Legalität
//
for (y=0; y<Hoehe; y++)
{
for (x=0; x<Breite; x++)
{
cin >> Eingabe;
//Überprüfung >9
//
while (Eingabe > 9)
{
cout << "Der von Ihnen eingegebene Wert ist groesser als 9!" << endl;
cout << "Bitte geben Sie einen neuen Wert ein!" << endl;
cin >> Eingabe;
}
//Überprüfung <0
//
while (Eingabe < 0)
{
cout << "Der von Ihnen eingegebene Wert ist kleiner als 0!" << endl;
cout << "Bitte geben Sie einen neuen Wert ein!" << endl;
cin >> Eingabe;
}
//Überprüfung doppelte Werte mit Ausnahme 0
if (Eingabe != 0)
{
for (m=0; m<Breite; m++)
{
for (n=0; n<Hoehe; n++)
{
if (Eingabe == Feld [n] [m])
{
cout << "Der Wert wurde bereits eingegeben!" << endl;
cout << "Bitte geben Sie einen neuen Wert ein!" << endl;
cin >> Eingabe;
}
}
}
}
Feld [x] [y] = Eingabe;
cout << "Bitte geben Sie den nächsten Wert ein!" << endl;
}
}
//Überprüfung ob das Sudoku gelöst werden kann (1 Zahl fehlt)
//Speichern der 0-Koordinaten
for (y=0; y<Hoehe; y++)
{
for (x=0; x<Breite; x++)
{
if (Feld [x] [y] == 0)
{
p++;
xWert0 = x;
yWert0 = y;
cout << p << endl;
cout << xWert0 << endl;
cout << yWert0 << endl;
}
}
}
if (p != 1)
{
cout << "Das Sudoku kann nicht gelöst werden!" << endl;
}
//Genau 1 Zahl fehlt
//
else
{
i=0;
while (i <= 15)
{
for (m=0; m<Breite; m++)
{
for (n=0; n<Hoehe; n++)
{
i++;
if (q == Feld [m] [n])
{
q++;
}
}
}
}
Feld [xWert0] [yWert0] = q;
}
//Sudoku-Feld ausgeben
//
for (y=0; y<Hoehe; y++)
{
for (x=0; x<Breite; x++)
{
cout << Feld [x] [y];
}
cout << endl;
}
return 0;
}
Über Hilfe und konstruktive Kritik würde ich mich sehr freuen!
MFG: blauerzettel
Zuletzt bearbeitet: