Einzelnen Beitrag anzeigen

Salazriel

Registriert seit: 13. Feb 2010
33 Beiträge
 
#9

Re: Problem im Umgang mit Sets

  Alt 15. Feb 2010, 18:49
Da ich mit dem Umgang mit Bits und dem Assembler überhaupt nicht auskenne (ist ja noch im Rahmen des Schulunterrichts ^^ )habe ich es so gemacht wie "alzaimar" es vorgeschlagen hat, auch wenn ich es für Trickserei ohne Ende halte und selbst drauf hätte kommen können.
So weit funktionierts jetzt, Sudokus die "sehr einfach" sind, können sogar schon komplett gelöst werden.
http://www.hib-wien.at/leute/wurban/..._strategie.pdf @amateurprofi danke für den link
Der offizielle Begriff dafür ist wohl Naked Singles. Jetzt möchte ich mindestens noch die Hidden Singles integrieren.
Mein Ansatz dafür wäre der, dass (am Beispiel einer Zeile):
Man nehme die FeldMenge einer Zelle und ziehe davon die FeldMengen aller anderen Zellen dieser Zeile ab, besteht diese reduzierte RestMenge aus genau einer Zahl, so muss diese Zahl in dieser Zelle stehen.
Über die Umsetzung des Ansatzes bin ich ehrlich gesagt recht stolz, hat mich doch einiges an Denkarbeit gekostet ^^

Delphi-Quellcode:
procedure TForm1.HiddenSingles;
var i,Spalte,Zeile,Anfangszelle,Verschiebung:integer;
    RestMenge:Zahlen;
begin
//Zeilenweise
For Zeile:=0 to 8 do
  For Anfangszelle:=0 to 8 do
    begin
    RestMenge:=FeldMenge[Anfangszelle,Zeile];
    For Verschiebung:=1 to 8 do
      begin
      RestMenge:=RestMenge-FeldMenge[(Anfangszelle+Verschiebung) mod 9,Zeile];
      For i:=1 to 9 do
        If RestMenge=[i]
        then
          begin
          StringGrid1.cells[Anfangszelle,Zeile]:=Inttostr(i);
          RestMengeNeuZuOrdnen(i,Anfangszelle,Zeile);
          end;
      end;
    end;
//Spaltenweise

//Blockweise
end;


procedure TForm1.RestMengeNeuZuordnen(EingegebeneZahl,Spalte,Zeile:integer);
var i:integer;
begin
FeldMenge[Spalte,Zeile]:=[]; //da bereits eine Zahl drinsteht
For i:=0 to 8 do
    begin
    FeldMenge[Spalte,i]:=FeldMenge[Spalte,i]-[EingegebeneZahl];
    FeldMenge[i,Zeile]:=FeldMenge[i,Zeile]-[EingegebeneZahl];
//Die Zahl aus den Restmengen der Zellen der gleichen Spalte und Zeile löschen)
    end;

Block.x:=1+(Spalte div 3);
Block.y:=1+(Zeile div 3);
RestMengenDerZellenDesBlocksNeuZuordnen(EingegebeneZahl,Block.x,Block.y);

NakedSingles;
HiddenSingles;
end;
Aber: es funktioniert nicht -.-
Mal ganz davon abgesehen, dass ich meinen Fehler nicht finde, ist das Programm nun iwie in der Lage, sehr schnell (komplett gelöste) Sudokus zu erstellen (einfach in einen Block die Zahlen von 1-9 eintippen)

Ich bin 'etwas' verwirrt ^^
Angehängte Dateien
Dateityp: exe project1_872.exe (425,5 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat