Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
648to652
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
648to652
648to652
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Sudoku

Sudoku
10.08.2005 23:27:11
Reinhard
Hallo Wissende,
in viele Tageszeitungen findet man jetzt Sudoko, soll süchtig machen, mal ausprobieren.
Es ist ein Quadrat von 9*9 Zellen, unterteilt in 9 Quadrate von 3*3 Zellen.
In jedem kleinen Quadrat sind einige Zellen (3-5 vorbelegt). Nun sollen die leeren Zellen mit den Ziffern 1 bis 9 befüllt werden dass folgende Regeln gelten:
In jedem der 9 kleinen Quadrate darf jede Zahl nur einmal vorkommen
Desgleichen in jeder Zeile und Spalte des großen Quadrates.
Das Sodoku der Frankfurter Rundschau vom 8.8 sieht so aus: Abcdefghi 3 8 7 3 7 9 8 2 6 1 8 38 56 4 5 8 1 9 4 2 6 4 9 6 Mein nachfolgender Code läuft bis es so aussieht: Abcdefghi 536184 7 dann hängt er sich auf, ist klar, er müßte die 2 oder 9 finden aber beide stehen schon in Spalte G. Jetzt fehlt mir die Idee/Code wie ich das mache dass er sich z.b. die 5 in A1 merkt mit einem anderen Wert in A nochmals probiert und falls das auch schiefgeht sich auch diesen merkt usw bis es klappt. An sich fehlt mir noch gesamte schwierige Teil des Codes *g Die Datei: <a href="https://www.herber.de/bbs/user/25510.xls">https://www.herber.de/bbs/user/25510.xls</a> Jetzt beim Schreiben kommt mit eine Idee, ich werde eine Variable anlegen, Dim V(9,9,9) und in der letzten Dimension die "verbotenen" Zahlen ablegen, also die die schon in der Reihe stehen und die mit denen es schon mal schiefging wie hier mit der 5 in A1. Vielleicht hat auch einer einen schnelleren oder besseren Grundansatz für das Problem. Gruß Reinhard Sub Sudoko() Dim z As Byte, s As Byte, x as Byte For z = 1 To 9 For s = 1 To 9 While Cells(z, s) = "" x = Int(Rnd() * 9) + 1 zähl = zähl + 1 If Application.WorksheetFunction.CountIf(Range(Cells(z, 1), Cells(z, 9)), x) = 0 _ And Application.WorksheetFunction.CountIf(Range(Cells(1, s), Cells(9, s)), x) = 0 Then Cells(z, s) = x 'call pruef(z,s,x) End If Wend Next s Next z End Sub Sub zurücksetzen() Range("K12:s21").Copy Destination:=[a1] End Sub Sub pruef(z, s, x) 'Pruef zu prüfen, soweit kam ich noch nicht :-) z1 = z s1 = s While Int(z1 / 4) <> z1 / 4 z1 = z1 - 1 Wend While Int(s1 / 4) <> s1 / 4 s1 = s1 - 1 Wend If Application.WorksheetFunction.CountIf(Range(Cells(z1, s1), Cells(z1 + 2, s1 + 2)), x) = 0 Then Cells(z, s) = x End If End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Link zu Sodoku
10.08.2005 23:39:08
Reinhard
Hallo,
http://www.ps-heine.de/sudoku/
Da wird von 3 Schwiergigkeitsstufen geredet. Wieso nur 3 Schwierigkeitsstufen?
Ich könnte doch jedes kleine Quadrat leer lassen, nur eine zahl reinschreiben, nur 2 usw.
Oder meinen die damit andere Feldgrößen?
Oder was anderes?
Gruß
Reinhard
noch offen o.w.T.
11.08.2005 00:12:19
Reinhard
Gruß
Reinhard
Idee
11.08.2005 09:37:16
MichaV
Hallo Reinhardt,
na da hast Du Dir ja wieder was vorgenommen ;o)
Hab davon erst kürzlich was gehört, scheint ja auch hier ein Hype zu werden. Ich habs mir mal kurz angesehen. Du versuchst es durch Probieren, aber es ist ja wohl ein LOGIK- Spiel, da muß es ohne Probieren gehen.
Als Idee:
Dein Feld geht m.E. am Besten mit Zelle(1,1,1)=True, Zelle(1,1,2)=True, Zelle(1,1,3)=True, Zelle(1,1,4)=True, Zelle(1,1,5)=False, Zelle(1,1,6)=True usw. bis Zelle(1,1,9)=True.
5 ist False, weil im Feld 1,1 die Zahl 5 steht.
Nun gehst Du, von jedem Feld ausgehend, die Spalten nach rechts und unten. Wenn Du auf eine Zahl triffst, dann kannst Du die in der Zelle wegstreichen. Für Zelle(1,1) sind dann also nur noch 1,5,6,7 und 8 True.
Wenn Du alle Zellen durchgeackert hast prüfst Du, ob in einer Deiner Zellen nur noch 1x True steht, dann hast du die erste Zahl gefunden.
Dann streichst Du diese Zahl in den Zellen in gleicher Spalte oder Zeile ab und prüfst wieder, ob Du eine Zelle mit nur einem True hast. Usw. bis alles gefunden wurde.
Wenn Du mal keine Zelle mit nur einer Möglichkeit hast, dann kannst du ja immernoch probieren und eine der möglichen Zahlen eintragen.
Gruss- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Idee - Ergänzung
11.08.2005 09:57:29
MichaV
Hallo,
das war wohl die kleine Schwierigkeitsstufe.
Für den Fall, daß Du keine Zelle mit eindeutigem Ergebnis hast:
Wenn sich eine Spalte und eine Zeile kreuzen, in denen nur eine Zahl 2x vorkommt (Also z.b. "1,2,3,4" und "4,5,6,7", dann muss diese Zahl (4) im Kreuzungspunkt der Zeile/ Spalte liegen.
Auch ist es besser, wenn Du nicht True und False nimmst, sondern 1 und 0 (ist ja irgendwo das Gleiche). Dann kannst Du besser rechnen (z.B. Alle 9 Zahlenmöglichkeiten addieren-&gt Ergebnis 2 -&gt es können 2 Zahlen in diesem Feld eingetragen werden ...oder Möglichkeiten der Zeile und Spalte addieren -&gt Ergebnis 2 -&gt diese Zahl wird in Spalte und Zeile gesucht.)
Gruss- Micha
PS: Rückmeldung wäre nett.
Anzeige
Wenn keine Rückmeldung kommt......
11.08.2005 15:00:17
Reinhard
Hallo Micha,
....dann hat mir Arcor aus finanztechnischen Gründen wieder mal für paar Tage den Internezugang gesperrt*g oder ich habe noch keine Lösung gefunden, ansonsten kommt der Code wenn ich den hinbekomme.
Gruß
Reinhard
AW: Wenn keine Rückmeldung kommt......
11.08.2005 15:06:53
MichaV
Hallo Reinhardt,
ich hab ihn schon so weit, daß er mir ein paar richtige Zahlen anzeigt und den Rest als mögliche Zahlenkombi. Ich hab aber eine Abfrage (mögliche Zahl kommt in Reihe/ Spalte nur 1x vor) noch nicht eingebaut.
 
 ABCDEFGHI
151.7.8291,834.6.84.6.7.81.4.8
2461.3.81.2.5.871.2.5.892.5.81.2.3.8
31.3.7.891.3.7.841.2.5.863.5.82.5.7.81.2.3.8
4951.3.7.81.2.7.861.2.4.83.4.82.4.82.3.4.8
51.2.6.7.841.6.7.81.2.5.7.831.2.5.85.6.892,8
62.3.6.82.3.83.6.82.5.892.4.5.83.4.5.6.817
71.3.6.81.3.81.3.4.5.6.81.5.6.81.5.8724,89
82.6.7.82.7.892.6.842,8135
91.2.81.2.81.4.5.831.2.5.8974,86
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
... aber mehr verrat ich nicht ;o) , will erstmal Deine Lösung sehen.
Gruss- Micha
PS: Meine Idee mit 1 und 0 anstelle von True und False war wirklich besser, nehme ich aber nur zum markieren, nicht zu rechnen.
PPS: Ich hatte noch nicht bedacht, daß innerhalb der kleinen Rechtecke jede Zahl nur 1x vorkommen darf. Ist aber lösbar- wie du siehst.
Anzeige
AW: Wenn keine Rückmeldung kommt......
11.08.2005 15:15:40
MichaV
Hallo Reinhardt,
ich hab ihn schon so weit, daß er mir ein paar richtige Zahlen anzeigt und den Rest als mögliche Zahlenkombi. Ich hab aber eine Abfrage (mögliche Zahl kommt in Reihe/ Spalte nur 1x vor) noch nicht eingebaut.
 
 ABCDEFGHI
151.7.8291,834.6.84.6.7.81.4.8
2461.3.81.2.5.871.2.5.892.5.81.2.3.8
31.3.7.891.3.7.841.2.5.863.5.82.5.7.81.2.3.8
4951.3.7.81.2.7.861.2.4.83.4.82.4.82.3.4.8
51.2.6.7.841.6.7.81.2.5.7.831.2.5.85.6.892,8
62.3.6.82.3.83.6.82.5.892.4.5.83.4.5.6.817
71.3.6.81.3.81.3.4.5.6.81.5.6.81.5.8724,89
82.6.7.82.7.892.6.842,8135
91.2.81.2.81.4.5.831.2.5.8974,86
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
... aber mehr verrat ich nicht ;o) , will erstmal Deine Lösung sehen.
Gruss- Micha
PS: Meine Idee mit 1 und 0 anstelle von True und False war wirklich besser, nehme ich aber nur zum markieren, nicht zu rechnen.
PPS: Ich hatte noch nicht bedacht, daß innerhalb der kleinen Rechtecke jede Zahl nur 1x vorkommen darf. Ist aber lösbar- wie du siehst.
Anzeige
AW: Wenn keine Rückmeldung kommt......
11.08.2005 16:28:26
Reinhard
Hallo ,
https://www.herber.de/bbs/user/25547.xls Ausgangsbild 3 8 Nachfolgender Code läuft nur in der ersten Zeile bis Spalte 8 2 3 4 1 8 9 5 7 jetzt müsste in Spalte 9 die 6 hin, die aber schon in der 9 Spalte existiert, also müsste der Code jetzt in A1 die 2 streichen aus x(1,1) und mit der 4 weitermachen. Macht es aber nicht, er läuft immer bis zur 7 als Endlosschleife:-( Gruß Reinhard Option Explicit Option Base 1 Dim x(9, 9) As String Sub Sudoko() Dim z As Byte, s As Byte, ss As Byte, tt As Byte For z = 1 To 9 'füllen For s = 1 To 9 x(z, s) = "123456789" Next s Next z Call wegstreichen eintragen: Call zurücksetzen For z = 1 To 9 For s = 1 To 9 If Cells(z, s) = "" Then If Application.WorksheetFunction.CountIf(Range(Cells(z, 1), Cells(z, 9)), Left(x(z, s), 1)) > 0 Or _ Application.WorksheetFunction.CountIf(Range(Cells(1, s), Cells(9, s)), Left(x(z, s), 1)) > 0 Then x(z, s) = Mid(x(z, s), 2) GoTo eintragen End If Cells(z, s) = Left(x(z, s), 1) Call wegstreichen End If Next s Next z 'For z = 1 To 9 ' Kontrolle ' For s = 1 To 9 ' Cells(zei + 1, 10) = x(z, s) ' zei = zei + 1 ' Next s 'Next z End Sub Sub wegstreichen() Dim z As Byte, s As Byte, ss As Byte, tt As Byte, zz As Byte For z = 1 To 9 'nichtzugelassene zahlen aus x(,) wegstreichen For s = 1 To 9 If Cells(z, s) = "" Then 'nur leere Zellen prüfen For ss = 1 To 9 'waaagerecht prüfen und wegstreichen For tt = 1 To 9 If CStr(Cells(z, ss)) = Mid(x(z, s), tt, 1) Then x(z, s) = Left(x(z, s), tt - 1) & Mid(x(z, s), tt + 1) Next tt Next ss For zz = 1 To 9 'senkrechtrecht prüfen und wegstreichen For tt = 1 To 9 If CStr(Cells(zz, s)) = Mid(x(z, s), tt, 1) Then x(z, s) = Left(x(z, s), tt - 1) & Mid(x(z, s), tt + 1) Next tt Next zz End If Next s Next z End Sub Sub zurücksetzen() Range("K12:s21").Copy Destination:=[a1] End Sub
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige