Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Sudoku

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.12.2008, 14:16 Uhr
Zealot



Hallo Ich Versuche gerade mit einfachen Mitteln ein Programm zu schreiben
das ein Sudoku löst.
allerdings bin ich Anfänger und weis nicht so recht wo der Fehler liegt
Das hier ist die Funktion die die Relevanten Felder vergleichen soll
dabei steht a für ein Leeres Feld und b - u für die zu prüfenden Felder
es gibt neun Flags für jede Zahl eine die dann auf true geschalten werden sollen wenn
eben die dazugehörige Zahl in den zu Prüfenden Feldern auftaucht.

Danach sollen alle neun Flags ausgewertet werden und mit dem nächsten Leeren Feld weiter
gemacht werden aber auch das funktioniert nicht ganz
ich dachte mir wenn nur noch ein flag auf false steht dann gibt es ja nur eine Lösungsmöglichkeit und in diesem Fall sollte dann die Zahl zugewiesen werden z.B
flag9==false && (flag1==true && flag2==true &&flag3==true, usw.) dann a=9
andernfalls direkt zum nächsten Feld
und flags in jedem fall auf false zurücksetzten


/Zweig der jedes Feld überprüft welchen Wert es hat und die flags setzt
if(a==0)
{
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==1)
flag1=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==2)
flag2=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==3)
flag3=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==4)
flag4=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==5)
flag5=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==6)
flag6=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==7)
flag7=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==8)
flag8=true;
else;
if((b||c||d||e||f||g||h||i||j||k||l||m||n||o||p||q||r||s||t||u)==9)
flag9=true;
else;
}
else;


Liegt das Problem an der Kette oder an den Vielen || vergleichen
Fehler gibt mir der Compiler im Übrigen keine aus das Programm ist wegen der
vielen variablen 300 Zeilen lang
kann es also leider nich komplet hier rein stellen.
oder gibts da ne Möglichkeit.
mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2008, 14:58 Uhr
Zealot



Ok Ich glaube ich habs
die Werte lassen sich scheinbar so nicht zusammenfassen
habe jetzt statt

((a || b || c) = = 1)
(a==1 || b==1 || c==1)

ganz schön Verhängnisvoll wenn man versucht sich schreibarbeit
zu sparen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2008, 20:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,

du hast nur dann noch folgendes Problem: Wenn du mit der Logik nicht weiterkommst, müsste dein Programm raten, was die ganze Sache deutlich aufwendiger macht (habe vor kurzem als Übungsaufgabe ein Sudoku-Lösungs-Programm gebastelt, bzw sind daran grade noch und dort haben wir da mit dem "Raten" so unsere Laufzeitprobleme )
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.12.2008, 14:58 Uhr
Zealot



Mit der Logik hatte ich weniger Probleme
Ich habe über das Sudoku, in meinem Fall ein 9x9 Felder großes,
ein Koordinatensystem gelegt also von a bis i und von 1 bis 9
nach diesem System habe ich jedem Feld eine eigene Variable spendiert
die ich nach ihrer Position im Koordinatensystem benannt
habe also a1 a2 a3 usw..

Dann habe ich eine Funktion geschrieben die es ermöglicht
zum Beispiel alle für a1 relevanten Felder zu Prüfen
ob eine der neun Zahlen dort auf taucht.
wenn nun nur ein Wert nicht vor kommt bekommt a1 diesen wert zugewiesen
gibt es mehrere mögliche werte die zugewiesen werden können
fährt das Programm zunächst mit dem nächsten Feld also a2 fort
bis jedes Feld des Sudoku durchgetestet ist und dann beginnt es wieder von vorn bis alle werte ermittelt sind.

Also mein Programm löst ein herkömmliches 9x9 Sudoku
in 3 bis 7 Testfasen also jedes Feld wurde 3-7 mal
auf Lösbarkeit getestet
und das dauert keine Sekunde.

Allerdings war es wegen der 81 Variablen doch recht viel
Schreibarbeit, ich habe mich lediglich,
Schleifen,
Vergleichsoperatoren,
und Kontrollstrukturen,
bedient und mein Programm ist auf gut 500 Zeilen angewachsen.

Wenn sich jemand den Quelltext mal anschauen möchte sagt
bescheid würde gern mal eure Meinung dazu hören.

Aber du hast recht es gibt Sudokus die nur mit Logik nicht zu lösen sind
also wo man sich für einen Wert entscheiden muss und erst anhand weiterer Lösungen
feststellt ob man richtig gelegen hat.
Aber die meisten Sudokus bieten eigentlich eine klare Lösbarkeit.

Dieser Post wurde am 20.12.2008 um 15:04 Uhr von Zealot editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.12.2008, 17:52 Uhr
~HeroHolger
Gast


Naja, Wenn du ein Sudoku hast mit Raten, dann würde ich die Logik von vornherein auf "Raten" bauen. Denn selbst mit "Raten" (und den entsprechenden Randbedingungen) kann man dann auch ein Sudoku lösen welches ohne Raten auch lösbar wäre.

In dem Sinne wäre es besser von vorn herein eine abstrakte Ebene nach oben zu gehen und von vorn herein einen sinnvollen "Rate"-Algorithmus zu basteln.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.12.2008, 15:32 Uhr
Zealot



Naja mit Raten hat das ja alles eigentlich nicht wirklich was zu tun
Das Programm braucht eine Logik und das Sudoku liefert gleich eine
mit.
Wahrscheinlich ist es deshalb auch ein recht beliebtes Übungsobjekt!

Es ist sicher nicht zu schwierig auch nachträglich das Programm
anzuweisen mehrere Lösungswege zu verfolgen.

Also wenn jetzt kein Feld lösbar ist muss er eben das mit den geringsten
möglichen wegen auswählen und dann ausprobieren.
Also wenn z.B eine 1 oder eine 2 eine Mögliche Lösung ist
muss er Beide Wege verfolgen und analysieren welcher zum Ergebniss führt.
Da währe es dann allerdings wirklich Interessant wieviele Ebenen
man einplanen muss.


Ein Sudoku lässt sich sicher nicht gut erraten

Dieser Post wurde am 22.12.2008 um 15:35 Uhr von Zealot editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: