WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Sudoku erstellen

 

CoNaN1984
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 29.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2010, 12:45     Titel: Sudoku erstellen
  Antworten mit Zitat      
Hallo Leute,

wir haben die Aufgabe bekommen ein Sudokugenerator zu programmieren.

Also meine Idee war folgende:

Ich erstelle eine Matrix 9x9 jeweil mit Variabeln.
Dann erzeuge ich Zahlen von 1 bis 9.
Wenn Abfrage, ob z1a=z1b ist dann wieder neu generieren
nachher Zeilen Abfrage, ob die Zahl da schon auftaucht.

Nun hab ich da was gemacht, da ich totaler Anfänger bin, sind meine If-Sätze und alles drum rum nicht so dolle, hoffe könnt mir helfen Smile

Code:

z1a=round(unifrnd(1,9,1,1))
z1b=round(unifrnd(1,9,1,1))
z1c=round(unifrnd(1,9,1,1))
z1d=round(unifrnd(1,9,1,1))
z1e=round(unifrnd(1,9,1,1))
z1f=round(unifrnd(1,9,1,1))
z1g=round(unifrnd(1,9,1,1))
z1h=round(unifrnd(1,9,1,1))
z1i=round(unifrnd(1,9,1,1))


M=[z1a z1b z1c z1d z1e z1f z1g z1h z1i;
z2a z2b z2c z2d z2e z2f z2g z2h z2i;
z3a z3b z3c z3d z3e z3f z3g z3h z3i;
z4a z4b z4c z4d z4e z4f z4g z4h z4i;
z5a z5b z5c z5d z5e z5f z5g z5h z5i;
z6a z6b z6c z6d z6e z6f z6g z6h z6i;
z7a z7b z7c z7d z7e z7f z7g z7h z7i;
z8a z8b z8c z8d z8e z8f z8g z8h z8i;
z9a z9b z9c z9d z9e z9f z9g z9h z9i];



if z1a==z1b
    z1b=(round(unifrnd(1,9,1,1))~=z1a)
    elseif (z1a==z1c)||(z1b==z1c)
        z1c=(round(unifrnd(1,9,1,1))~=z1a~=z1b)
        elseif (z1a==z1d)||(z1b==z1d)||(z1c==z1d)
            z1d=(round(unifrnd(1,9,1,1))~=z1a~=z1b~=z1c)
            elseif (z1a==z1e)||(z1b==z1e)||(z1c==z1e)||(z1d==z1e)
                z1e=(round(unifrnd(1,9,1,1))~=z1a~=z1b~=z1c~=z1d)
                elseif (z1a==z1f)||(z1b==z1f)||(z1c==z1f)||(z1d==z1f)||(z1e==z1f)
                    z1f=(round(unifrnd(1,9,1,1))~=z1a~=z1b~=z1c~=z1d~=z1e)
                    elseif (z1a==z1g)||(z1b==z1g)||(z1c==z1g)||(z1d==z1g)||(z1e==z1g)||(z1f==z1g)
                        z1g=(round(unifrnd(1,9,1,1))~=z1a~=z1b~=z1c~=z1d~=z1e~=z1f)
                        elseif (z1a==z1h)||(z1b==z1h)||(z1c==z1h)||(z1d==z1h)||(z1e==z1h)||(z1f==z1h)||(z1g==z1h)
                            z1h=(round(unifrnd(1,9,1,1))~=z1a~=z1b~=z1c~=z1d~=z1e~=z1f~=z1g)
                            else(z1a==z1i)||(z1b==z1i)||(z1c==z1i)||(z1d==z1i)||(z1e==z1i)||(z1f==z1i)||(z1g==z1i)||(z1h==z1i)
                                z1i=(round(unifrnd(1,9,1,1))~=z1a~=z1b~=z1c~=z1d~=z1e~=z1f~=z1g~=z1h)
end

 



Im Voraus meinen Dank
Private Nachricht senden Benutzer-Profile anzeigen


Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 29.10.2010, 12:57     Titel:
  Antworten mit Zitat      
Wo ist das Problem und die Frage?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 13:09     Titel: Re: Sudoku erstellen
  Antworten mit Zitat      
Hallo CoNaN1984,

hast Du denn auch eine Frage, bei der wir Dir helfen können?

Code:
z1c = (round(unifrnd(1,9,1,1))~=z1a~=z1b)

Ich vermute, diese Zeile macht nicht das, was Du erwartest.
"A~=B" erzeugt einen skalaren LOGICAL, "(A~=B)~=C" vergleich diesen dann mit dem Dritten Wert.
Dewegen kann ich Deinen Ansatz nicht nachvollziehen.

Mir ist die Funktion "unifrnd" übrigens unbekannt.
Wenn Du einen 3x3 Block mit den Zahlen 1 bis 9 erstellen möchtest, wird es extrem lange dauern solange Zufallszahlen zu ziehen, bis keine doppelt vorkommt! Wenn Du das für die ganze 9x9 Matrix versucht, können das schon ein paar Millionen Jahre Rechenzeit sein.

Viell schneller geht es gleich mit der Voraussetzung zu beginnen und den Vektor [1:9] einfach zufällig zu mischen (siehe RANDPERM).

Trotzdem würde ich für ein Sudoku einen ganz anderen Ansatz wählen. Zum Glück wimmelt es im Netz ja von Beschreibungen...

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
CoNaN1984
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 29.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2010, 13:16     Titel:
  Antworten mit Zitat      
ok danke, also ist das schwachsinnig was ich mir da so vorgestellt habe, direkt verwerfen und garnicht weiter machen!

Das stimmt mit den Beispielen im Netz, jedoch sind so recht komplex für mich aufgebaut, habe dies nicht nachvollziehen können, da sogar irgendwelche Grafiken erzeugt werden und das verwirt momentan noch.

Vllt. hab ich am ende dieses Semesters mehr drauf Wink

Auf ein neues mit Randperm

Danke euch
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 13:46     Titel:
  Antworten mit Zitat      
Hallo CoNaN1984,

http://www.spektrum.de/artikel/836129

Ein Sudoku zu lösen und eines zu erstellen geht mit der gleichen Methode.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
CoNaN1984
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 29.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2010, 20:03     Titel:
  Antworten mit Zitat      
Also hab mich nochmal dran gesetzt und hab jetzt ein anderes programmchin geschrieben, jedoch ist da noch was krumm an der Sache, also ich lass prüfen, ob in der ein unteren Zeile die Spalte die gleiche Zahl hat und das immter weiter, jedoch kommt es immer vor, dass ich in der selben Spalte die gleiche Zahl auftaucht, ich find mein Fehler nicht, hoffe ihr hab da eine Idee, wäre euch recht dankbar Wink

Code:

%Erstellen Vektoren von 1 bis 9
z1=[1:9]
z2=[1:9]
z3=[1:9]
z4=[1:9]
z5=[1:9]
z6=[1:9]
z7=[1:9]
z8=[1:9]
z9=[1:9]

%Im voraus die Zahlen von 1 bis 9 mischen
z1=randperm(9)
z2=randperm(9)
z3=randperm(9)
z4=randperm(9)
z5=randperm(9)
z6=randperm(9)
z7=randperm(9)
z8=randperm(9)
z9=randperm(9)



%Erstellung der 9x9 Matrix mit den vorhanden Vektoren
M=[z1; z2; z3; z4; z5; z6; z7; z8; z9]


n=9

%1. Prüfe, ob in den Spalten die gleichen Zahlen kommen, wenn ja dann
%2. Prüfung

%2. Prüfung, ob die untere Zeile einen Identische Zahl in der selben Spalte
%hat, wenn ja dann nochmal neu Zahlen von 1 bis 9 generieren

%Zähler von 1 bis 9, da 9 Spalten
for j=1:n
 while ((M(1,j)==M(9,j))||(M(2,j)==M(9,j))||(M(3,j)==M(9,j))||(M(4,j)==M(9,j))||(M(4,j)==M(9,j))||(M(5,j)==M(9,j))||(M(6,j)==M(9,j))||(M(7,j)==M(9,j))||(M(8,j)==M(9,j)))


for j=1:n
    while (M(1,j)==M(2,j))
        M(2,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(3,j))||(M(2,j)==M(3,j)))
        M(3,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(4,j))||(M(2,j)==M(4,j))||(M(3,j)==M(4,j)))
        M(4,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(5,j))||(M(2,j)==M(5,j))||(M(3,j)==M(5,j))||(M(4,j)==M(5,j)))
        M(5,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(6,j))||(M(2,j)==M(6,j))||(M(3,j)==M(6,j))||(M(4,j)==M(6,j))||(M(4,j)==M(6,j))||(M(5,j)==M(6,j)))
        M(6,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(7,j))||(M(2,j)==M(7,j))||(M(3,j)==M(7,j))||(M(4,j)==M(7,j))||(M(4,j)==M(7,j))||(M(5,j)==M(7,j))||(M(6,j)==M(7,j)))
        M(7,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(8,j))||(M(2,j)==M(8,j))||(M(3,j)==M(8,j))||(M(4,j)==M(8,j))||(M(4,j)==M(8,j))||(M(5,j)==M(8,j))||(M(6,j)==M(8,j))||(M(7,j)==M(8,j)))
        M(8,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(9,j))||(M(2,j)==M(9,j))||(M(3,j)==M(9,j))||(M(4,j)==M(9,j))||(M(4,j)==M(9,j))||(M(5,j)==M(9,j))||(M(6,j)==M(9,j))||(M(7,j)==M(9,j))||(M(8,j)==M(9,j)))
        M(9,:)=randperm(9)
    end
end

 end
 end
 

 
Private Nachricht senden Benutzer-Profile anzeigen
 
CoNaN1984
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 29.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2010, 20:23     Titel:
  Antworten mit Zitat      
Mein dank an euch, die Ideen von euch waren super, es läuft jetzt, hab doch den Fehler gefunden Wink

und so siehts aus, braucht zwar zwischen 5 bis 10 min für die Berechnung, jedoch es läuft Laughing

Code:


%Erstellen Vektoren von 1 bis 9
z1=[1:9]
z2=[1:9]
z3=[1:9]
z4=[1:9]
z5=[1:9]
z6=[1:9]
z7=[1:9]
z8=[1:9]
z9=[1:9]

%Im voraus die Zahlen von 1 bis 9 mischen
z1=randperm(9)
z2=randperm(9)
z3=randperm(9)
z4=randperm(9)
z5=randperm(9)
z6=randperm(9)
z7=randperm(9)
z8=randperm(9)
z9=randperm(9)



%Erstellung der 9x9 Matrix mit den vorhanden Vektoren
M=[z1; z2; z3; z4; z5; z6; z7; z8; z9]


n=9

%1. Prüfe, ob in den Spalten die gleichen Zahlen kommen, wenn ja dann
%2. Prüfung

%2. Prüfung, ob die untere Zeile einen Identische Zahl in der selben Spalte
%hat, wenn ja dann nochmal neu Zahlen von 1 bis 9 generieren

%Zähler von 1 bis 9, da 9 Spalten

for j=1:n
while M(:,j)==M(:,j)  

    for j=1:n
    while (M(1,j)==M(2,j))
        M(2,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(3,j))||(M(2,j)==M(3,j)))
        M(3,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(4,j))||(M(2,j)==M(4,j))||(M(3,j)==M(4,j)))
        M(4,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(5,j))||(M(2,j)==M(5,j))||(M(3,j)==M(5,j))||(M(4,j)==M(5,j)))
        M(5,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(6,j))||(M(2,j)==M(6,j))||(M(3,j)==M(6,j))||(M(4,j)==M(6,j))||(M(4,j)==M(6,j))||(M(5,j)==M(6,j)))
        M(6,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(7,j))||(M(2,j)==M(7,j))||(M(3,j)==M(7,j))||(M(4,j)==M(7,j))||(M(4,j)==M(7,j))||(M(5,j)==M(7,j))||(M(6,j)==M(7,j)))
        M(7,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(8,j))||(M(2,j)==M(8,j))||(M(3,j)==M(8,j))||(M(4,j)==M(8,j))||(M(4,j)==M(8,j))||(M(5,j)==M(8,j))||(M(6,j)==M(8,j))||(M(7,j)==M(8,j)))
        M(8,:)=randperm(9)
    end
end

for j=1:n
    while ((M(1,j)==M(9,j))||(M(2,j)==M(9,j))||(M(3,j)==M(9,j))||(M(4,j)==M(9,j))||(M(4,j)==M(9,j))||(M(5,j)==M(9,j))||(M(6,j)==M(9,j))||(M(7,j)==M(9,j))||(M(8,j)==M(9,j)))
        M(9,:)=randperm(9)
    end
end
end
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.10.2010, 21:50     Titel:
  Antworten mit Zitat      
Hallo CoNaN1984,

Glückwunsch!

Im Code taucht übrigens mehrfach "(M(4,j)==M(6,j))||(M(4,j)==M(6,j))" auf. Ein Test reicht.

Vielleicht hilft ANY beim Beschleunigen:
Code:

for j = 1:n
    while any(M(1:8, j) == M(9, j))
        M(9, :) = randperm(9)
    end
end
 

Erfüllt Dein Programm wirklich alle Sudoku-Regeln? Also auch dass die 3x3-Unter-Matrizen alle 9 Ziffern enthalten?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.