AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei Sudoku Korrektur

Ein Thema von Grimsch · begonnen am 14. Dez 2009 · letzter Beitrag vom 15. Dez 2009
Antwort Antwort
Grimsch

Registriert seit: 14. Dez 2009
5 Beiträge
 
#1

Fehler bei Sudoku Korrektur

  Alt 14. Dez 2009, 18:15
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:
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;
wäre super wenn ihr mir helfen könntet... muss das spiel morgen im Unterricht vorstellen >.<
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Fehler bei Sudoku Korrektur

  Alt 14. Dez 2009, 18:28
Zitat von Grimsch:
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.
Ohne mir dein Code angesehen zu haben - du solltest das nochmal überdenken:
Was ist in dem Fall, wenn folgende Zahlen vorkommen:
9, 9, 9, 9, 4, 5, 0, 0, 0

MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Grimsch

Registriert seit: 14. Dez 2009
5 Beiträge
 
#3

Re: Fehler bei Sudoku Korrektur

  Alt 14. Dez 2009, 18:37
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^^
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Fehler bei Sudoku Korrektur

  Alt 15. Dez 2009, 10:32
Naja alternativ mit den Bits eines Integers rechnen?
Delphi-Quellcode:
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;
Ich hoffe das geht so 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).
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:
0..irgendwas..0111111111 and
000000000000000111111111 =
============================
000000000000000111111111
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

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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Grimsch

Registriert seit: 14. Dez 2009
5 Beiträge
 
#5

Re: Fehler bei Sudoku Korrektur

  Alt 15. Dez 2009, 17:30
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^^
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Fehler bei Sudoku Korrektur

  Alt 15. Dez 2009, 18:00
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...
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Grimsch

Registriert seit: 14. Dez 2009
5 Beiträge
 
#7

Re: Fehler bei Sudoku Korrektur

  Alt 15. Dez 2009, 18:09
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^^
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Fehler bei Sudoku Korrektur

  Alt 15. Dez 2009, 18:17
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....
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Grimsch

Registriert seit: 14. Dez 2009
5 Beiträge
 
#9

Re: Fehler bei Sudoku Korrektur

  Alt 15. Dez 2009, 18:20
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^^
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#10

Re: Fehler bei Sudoku Korrektur

  Alt 15. Dez 2009, 18:41
Zitat von Grimsch:
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.
Die Überprüfungsmethode funktioniert aber nur solange das Rätsel eine eindeutige Lösung besitzt Und Rätsel mit einer eindeutigen Lösung zu generieren... das ist dann ne andre Sache

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz