![]() |
Fehler bei Sudoku Korrektur
Hallo liebe Community ich hätte da mal eine Frage.
Und zwar programmiere ich gerade ein Sudoku per Delphi aber komme gerade nicht weiter, da sich irgendwie bei mir ein Fehler eingeschlichen hat. Meine Idee war es die Korrektur bzw die Überprüfung ob das Sudoku richtig ist mit Summen zu lösen, d.h. in jeder spalte, zeile und quadrat muss eine Summe von 45 vorliegen. Allerdings kommt zum schluss bei mir immer nach der Überprüfung die Meldung dass die lösung falsch sei. hier der quelltext in dem ich den Fehler vermute:
Delphi-Quellcode:
wäre super wenn ihr mir helfen könntet... muss das spiel morgen im Unterricht vorstellen >.<
function testspalte:boolean; {Namensgebung der Funktion}
var x, y, sum: integer; begin result:= false; {Ergebnis ist vorerst falsch} for x:= 0 to 8 do {alle spalten werden gezählt} begin sum:= 0; {summe wird auf null gestellt für jede neue spalte} for y := 0 to 8 do {alle reihen durchzählen} sum:= sum+ sudoku[x,y,a]; {den wert des jeweiligen Feldes zur Summe hinzuaddiern} if sum<>45 then {wenn summe nicht 45 dann bleibt result:=false} exit; end; result:= true; {nachdem der test bestanden werden sollte wird das ergebnis auf true gesetzt} end; function testzeile:boolean; var x, y, sum: integer; begin result:=false; for y:= 0 to 8 do begin sum:=0; for x:= 0 to 8 do sum:= sum+ sudoku[y,x,a]; if sum<>45 then exit; end; result:= true; end; function testquadrat:boolean; var p, q, x, y, sum:integer; begin result:= false; for p:= 0 to 2 do {spalten der quadrate durczählen} for q:= 0 to 2 do {reihen der quadrate durchzählen} begin sum:= 0; for x:= 0 to 2 do {spalten in den quadraten zählen} for y:= 0 to 2 do {reihen in den quadraten zählen} sum:= sum + sudoku[p*3+x,q*3+y,a]; {in diesem fall muss mal 3 genommen werden, da jeweils 9 zeilen und spalten vorhanden sind und nicht nur 3.} if sum<>45 then exit; end; result:= true; end; procedure TForm1.Button2Click(Sender: TObject); begin if testspalte and testzeile and testquadrat then showmessage('Sie haben das Sudoku richtig gelöst!') {wenn in allen funktionen der test bestanden wurde erscheint diese Nachricht} else showmessage('Das Sudoku ist fehlerhaft.'); {ansonsten fehlermeldung} end; |
Re: Fehler bei Sudoku Korrektur
Zitat:
Was ist in dem Fall, wenn folgende Zahlen vorkommen: 9, 9, 9, 9, 4, 5, 0, 0, 0 MfG |
Re: Fehler bei Sudoku Korrektur
nunja 0 kann schonmal nicht vorkommen da ich das begrenzt habe zwischen 1 und 9.
außerdem wenn sowas vorkommen sollte dann müsste das genauso auch in den darauf folgeneden spalten auch passen sowie mit den quadraten. Also würde das schon funktionieren außer es hat jemand spaß daran das so zu machen dass es anders genau passt. oder halt nur 5 einfügt aber das ist ja nicht der sinn der sache^^ |
Re: Fehler bei Sudoku Korrektur
Naja alternativ mit den Bits eines Integers rechnen?
Delphi-Quellcode:
Ich hoffe das geht so :P aber meine Idee war, dass du das n-te Bit auf 1 setzt, wenn die Zahl vorhanden ist. Und zum Schluss müsste dann dort irgendwie 0...0111111111 stehen (die 9 niedrigsten Bits stehen auf 1).
function SpalteTesten(ASpalte : Integer) : Boolean;
const CARDINAL_POS : array [1..9] of Cardinal = (1, 2, 4, 8, 16, 32, 64, 128, 256); ALL_SET = 511; var i : Integer; Werte : Cardinal; // Gibt es eine art UShortInt? begin Werte := 0; for i := 0 to 8 do begin Werte := Werte or CARDINAL_POS[sudoku[<hier den wert :D>]]; end; Result := Werte and ALL_SET = ALL_SET; end; Dazu setzten wir in der Schleife das n-te Bit auf 1 indem wir den Wert vorher nehmen (ich betrachte erstmal nur die 9 niedrigsten Bits). Zum Beispiel sieht Werte vorher so aus: 000000000 Wenn dann im aktuellen Feld eine 3 steht, dann wird das 3. Bit auf 1 gesetzt: 000000100 Wenn wir dann wieder auf ein Feld mit einer 3 treffen passiert aber gar nichts mehr. Und dann ganz zum Schluss überprüft er ob alle auf 1 stehen. Und zwar ist 111111111b = 511d (wenn ich mich irre). das heißt wir müssen nur die unteren 9 Bits betrachten. Dazu können wir and verwenden:
Code:
Weil bei add ist das Bit im Ergebnis nur 1, wenn die Bits in den beiden Werten 1 sind. Wenn dann das zweite und Ergebnis gleich sind, dann ist auch das obere mindestens so groß wie das obere. Ich weiß klingt ein bisschen komisch :P
0..irgendwas..0111111111 and
000000000000000111111111 = ============================ 000000000000000111111111 Aber dafür gibt es ein ganz gutes Tutorial hier irgendwo. MfG Fabian PS: Und wenn du Platz sparen willst kannst du satt 32 bit auch 16bit verwenden ;) 9 bit würden reichen, aber sowas gibt es nicht :D |
Re: Fehler bei Sudoku Korrektur
ok danke für die mühe aber musste das spiel heute schon abgeben bzw präsentieren. ich vermute der lehrer war zufrieden auch wenn zum schluss immer "falsch" stand. naja vllt wirds ja wenigstens noch im 2 stelligen bereich sein also eine 2^^
|
Re: Fehler bei Sudoku Korrektur
Auch wenn es vielleicht zu Spät ist: Ich habe mal den Tipp gelesen, erst ein vollständiges Sudoku Retzel generieren und dann einige Stellen löschen. Aber du hast die Lösungen schon in einem 2D Map oder so liegen. Müsste das nicht auch gehen ? Ich habe die Idee noch nicht ausprobiert...
|
Re: Fehler bei Sudoku Korrektur
hmm stimmt das mit dem erst generieren lassen und die zahlen irgendwo speichern bevor man sie löscht um sie dann zur überprüfung zu verwenden wäre natürlich auch eine gute idee gewesen. naja mist zu spät^^
|
Re: Fehler bei Sudoku Korrektur
Kannst du ja immer noch mal umsetzten nur so als Übung. Dir bringt es alle male was und vielleicht zeigst du dann dem Lehrer das Programm *G*.... vielleicht bekommst du dann noch Plus-Punkte....
|
Re: Fehler bei Sudoku Korrektur
joa dafür müsste ich allerdings erstmal rausfinden wie das mit dem selbst generieren funktioniert usw und das dauert auch erstmal bis ich das alles verstanden habe und das müsste dann bis morgen fertig sein da dann der letzte termin für das eintragen der noten wäre.
naja wird schon schief gehen^^ |
Re: Fehler bei Sudoku Korrektur
Zitat:
greetz Mike |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz