Autor |
Beitrag |
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 27.11.08 14:26
Hallo,
das glaube ich ja nun garnicht.
Mein erster Versuch dauerte auf meinen Notebooki 2253 ms/44804 Versuche , der zweite 3225 ms/79035 dann 14891 ms/449245 Versuche
Schau Dir doch mal Programme für Sudoku an, das ja sehr ähnliche Belegungsregeln hat, und deren zufällige Belegung anschaust.
Da wird der Zufall nur einmal pro Zelle eingesetzt. Dazu muss man aber für jede Spalte und Zeile buchführen.
Also für jede Zeile/Spalte ein Feld der möglichen Zahlen.
Für jedes Feld (ze,sp):
Schnittmenge aus möglicheZe(ze) und möglicheSp(sp) bilden.
dabei Anzahl ermmitteln
Per Zufall eine von 1 bis Anzahl auswählen
Diese aus mögliche(ze) und mögliche(sp) entfernen und Feld(ze,sp]) damit belegen.
Da braucht man nicht wie jetzt bei n=32 nicht 2e5 Fehlversuche, sondern nur 32x32=1024 Versuche.
Gruß Horst
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 27.11.08 15:08
Hallo,
apropos mehrere Prozessorkerne.
Jeder Prozessorkern kann an Zeile/Spalte arbeitem die nicht von einem anderen beackert wird.
Zwei Cpu-Kernen und einem Quadrat 32x32
CPU_0: Zeile 1..16 und Spalte 1..16
zeitgleich:
CPU_1: Zeile 17..32 und Spalte 17..32.
wenn beide zeilenweise vorgehen
Dann kann z.B CPU_0 mit Zeile 17 weitzermachen, wenn CPU_1 damit schon fertig ist.
umgekehrt CPU_1 mit Zeile 1 weitzermachen, wenn CPU_0 damit schon fertig ist.
Das heisst jede CPU erhält ihren konstanten Spaltenbereich mit Breite n/Cpu_Anzahl, aber startet um n/Cpu_Anzahl versetzt.
Wenn alle CPU's fast gleich schnell sind ist es auch Cpu_Anzahl-fach schneller.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Schritt 1 0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxx1111 xxxxxxxx xxxxxxxx xxxxxxxx |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Schritt 2 0000xxxx 0000xxxx xxxxxxxx xxxxxxxx xxxx1111 xxxx1111 xxxxxxxx xxxxxxxx |
..
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Schritt 5 Cpu_0 war anderweitig beschäftigt CPU_1 kann aber bei zeile 1 (oder 2) weitermachen 00001111 0000xxxx xxxxxxxx xxxxxxxx xxxx1111 xxxx1111 xxxx1111 xxxx1111 |
Gruß Horst
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: Do 27.11.08 15:59
Horst_H hat folgendes geschrieben : | Hallo,
apropos mehrere Prozessorkerne.
Jeder Prozessorkern kann an Zeile/Spalte arbeitem die nicht von einem anderen beackert wird.
Zwei Cpu-Kernen und einem Quadrat 32x32
CPU_0: Zeile 1..16 und Spalte 1..16
zeitgleich:
CPU_1: Zeile 17..32 und Spalte 17..32.
|
Reden wir hier über das vertauschen von Zeilen/Spalten oder das Befüllen mit Zahlen per Backtracking?
Bei ersterem hättest du das Problem, dass Zeile 1 die Elemente [0][0] bis [0][31] beinhaltet, also alle Spalten,
bei zweiterem müsste man die Ergebnisse immer synchronisieren...
Man könnte natürlich wenn man mehr als 2 Kerne hat einen benutzen, um "swap-threads" zu erstellen, und die anderen arbeiten die dann ab,
aber ich habe so meine Zweifel ob das wirklich sinnvoll ist...
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 27.11.08 18:18
Hallo,
EDIT:
Alles falsch, vo wegen der Aufteilbarkeit auf mehrere Prozessoren
Aber eine andere Idee
Ich erzeuge eine Standardmatrix die durch simple Verschiebung, die die Kriterien erfüllt
Quelltext 1: 2: 3: 4: 5:
| 12345 51234 45123 34512 23451 |
Jetzt Miller Yates Mischen (erzeugt eine zufällige Permutation) Spalten, aber nur eine Liste was gemacht werden soll:
Tausche Spalten 5-3(Random(5)+1),4-2(Random(4)+1),3-1,1-1
Das gleiche mit den Zeilen
Tausche Zeilen 5-2,4-4,1-3,1-1
Jetzt eine Liste dieser Operationen erstellen und diese mischen.
Gruß Horst
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 28.11.08 11:47
Hallo,
wenigstens eine kleine Verbesserung des Programmes soll rausspringen:
n= 500 in 610 ms
Gruß Horst
EDIT: Programm entfernt, erzeugt zu wenig Möglichkeiten
Zuletzt bearbeitet von Horst_H am Fr 28.11.08 15:59, insgesamt 1-mal bearbeitet
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: Fr 28.11.08 12:35
Ich hab mir da mal schnell was zusammengeklatscht, ich brauch für eine 64x64-Matrix und 5000 Vertauschungen 46ms...
Ist Delphi so langsam? (Also ich hab das gerade schnell in C gemacht...)
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 28.11.08 12:36
Delphi ist da normalerweise nicht wirklich langsamer, es kommt immer auf die Umsetzung an  .
|
|
freedy 
      
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Fr 28.11.08 12:44
Die Umsetzung ist eigentlich alles (s. Adventsgewinnspiel). Aber ich finde es faszinierend, dass dieses Thema inzwischen so viele beschäftigt.
Danke übrigens für deine Umsetzung, Horst. Probiere es heute Nachmittag mal aus.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 28.11.08 15:55
Hallo,
@thorsten83:
Wenn du 5000 Vertauschungen bei 64x64 hast, hast Du erheblich weniger als freedy's Version und erheblich mehr als meine Version, die maximal 2*(n-1) Tauschungen vornimmt.
Meine Stoppuhr läßt das Befüllen des Stringsgrids aussen vor.
Ich habe jetzt die Matrix privat gemacht ( habe ich jetzt nicht hochgeladen ) und fülle den Stringgrid1 bei Bedarf daraus.
n = 1000 dauert jetzt 153 ms und belegt 8 MB im Taskmanger.
n= 5000 dauert jetzt 7892 ms und belegt 101 Mb
Bleibt die Frage: mache ich genug Vertauschungen.
Die Möglichkeiten sind:
Erste Zeile: Feld(0,0) =n fallend um 1 bis Feld(0,n-1)=1
Zweite Zeile Feld(1,0) =n-1 fallend bis Feld(1,n-2)=1,Feld(1,n-1)=1
..
n.te Zeile Feld(1,0) =1 bis Feld(1,n-1)=1
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Beispiel für n = 5 5 4 3 2 1 4 3 2 1 1 3 2 1 1 1 2 1 1 1 1 1 1 1 1 1
120 24 6 2 1 = 5!*4!*3!*2!*1! |
Das sind ( Produkt (i=1..n) n! ) Möglichkeiten // Superfactorials: product of first n factorials hilft mir irdenwie nicht, naja kleiner als (n^2) !...
Zeilen Tauschen erzeugt eine aus n! Möglichkeiten.
Spalten Tauschen erzeugt eine aus n! Möglichkeiten.
Die Abfolge der Operationen Spalte/Zeile tauschen hat (2*n)!Möglichkeiten
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| n n! Super n!^2 (2*n)! 1 1 1 1 2 2 2 2 4 24 3 6 12 36 720 4 24 288 576 40320 5 120 34560 14400 3628800 6 720 24883200 518400 479001600 7 5040 1,25411E+11 25401600 87178291200 8 40320 5,05658E+15 1625702400 2,09228E+13 9 362880 1,83493E+21 1,31682E+11 6,40237E+15 10 3628800 6,65861E+27 1,31682E+13 2,4329E+18 11 39916800 1,32895E+35 1,59335E+15 1,124E+21 12 479001600 6,3657E+43 2,29443E+17 6,20448E+23 13 6227020800 2,75273E+51 3,87758E+19 4,03291E+26 14 87178291200 2,39978E+62 7,60005E+21 3,04888E+29 |
Ab n = 11 erreiche ich irgendwie nicht mehr alle Möglichkeiten. von den 10^35
Es gibt ja auch die Möglichkeit, zwei Zeilen zweimal zu tauschen und dazwischen zwei Spalten. Das würde mein Algorithmus nicht immer können, da bei Miller yates die Obergrenze immer kleiner wird.
Schade, muss ich wieder mit Schnittmengen der Belegung arbeiten und zwar nicht nur aus Zeile und Spalte sondern bei zeilenweisem Vorgehen Zeile und Spalte einschliesslich deren folgenden Spalten.Mühselig ernährt sich das Eichhörnchen
Gruß Horst
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: So 30.11.08 09:55
Hallo,
ich habe das jetzt auch super-factorial mäßig gemischt, um bei dem Latein Quadrat hoffentlich alle Möglichkeiten zu erzeugen.
Am Beispiel n= 5.
1. Mischen (X) komplett , Damit steht dann unten rechts fest (O)
2. Mischen nur die ersten 4 Zeilen/Spalten
3. Mischen nur die ersten 3 Zeilen/Spalten
4. Mischen nur die ersten 2 Zeilen/Spalten
Quelltext 1: 2: 3: 4: 5:
| XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX->XXXXX->XXXXX->XXOOO XXXXX XXXXX XXXOO XXOOO XXXXX XXXXO XXXOO XXOOO |
n = 500 dauert statt 610 ms nun 26?? ms (Tauschen mit sich selbst werden jetzt nicht mehr ausgeführt ..)
Anzahl der Tauschungen = Summe (i := 2 to n) 2*(i-1)= 2*Summe(i=1..n-1) i
=2 * n*(n-1)/2 = n*(n-1) ~ n^2
Bei n= 64 (Thorsten83) sind es 4032 Tauschungen bei n=500 sind es schon 250000.
Gruß Horst
P.S.:
Was mich ärgert , das man für den ersten Zustand , also unten rechts eine Zahl auswählen eigentlich nur eine! beliebige Zeile oder Spalte hintauschen müsste und nicht das komplette Feld verwirbeln.
Dann wäre der Vorgang linear:
Quelltext 1: 2: 3: 4:
| bie n Wähle eine Zeile aus n tausche mit letzter Zeile n, wieder hole für j= 1 to n-2 dann eine Zeile aus n-j aus tausche mit Zeile n-j, dann eine Spalte aus n-j aus tausche mit Spalte n-j, |
Einloggen, um Attachments anzusehen!
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: So 30.11.08 13:36
Hey,
wer oder was ist Miller yates?
Was die Anzahl der möglichen Anordnungen angeht bin ich auf das gleiche Ergebnis gekommen, allerdings spuckt mein (zugegebenermaßen schnell zusammengeklatschter) Backtracker noch was anderes aus...
Jetzt bleibt halt die Frage: wie viele Vertauschungen brauche ich denn, damit das Ergebnis "zufällig" ist? Bzw.: wie definiert man in dem Kontext zufällig?
Die größere Anzahl von Möglichkeiten beim Vertauschen ergibt sich doch daraus, dass das Vertauschen einer Spalte und einer Zeile kommutativ ist, oder?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 30.11.08 14:37
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: So 30.11.08 14:44
Hallo,
O.K geht der miller eben phishen...
Zitat: | Die größere Anzahl von Möglichkeiten beim Vertauschen ergibt sich doch daraus, dass das Vertauschen einer Spalte und einer Zeile kommutativ ist, oder?
|
Ist es leider nicht.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| Ausgang 0 1 2 3 4 1 2 3 4 0 2 3 4 0 1 3 4 0 1 2 4 0 1 2 3
Tausch Spalte 2 mit 4 Tausch Zeile 1 mit 2 Tausch Spalte 1 mit 2 Tausch Zeile 0 mit 3
3 2 1 0 4 2 1 0 4 3 4 3 2 1 0 1 0 4 3 2 0 4 3 2 1
Jetzt die selben Tauschvoränge in anderer Reihen folge
Tausch Spalte 1 mit 2 (vorher Pos 3) Tausch Zeile 0 mit 3 (vorher Pos 4) Tausch Spalte 2 mit 4 (vorher Pos 1) Tausch Zeile 1 mit 2 (vorher Pos 2)
3 2 1 0 4 0 4 3 2 1 2 1 0 4 3 1 0 4 3 2 4 3 2 1 0 |
Gruß Horst
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: So 30.11.08 14:54
Hey,
da hast du auch die Reihenfolge der Vertauschungen zweier Spalten verändert...
Und genau das ist wiederum nicht kommutativ wenn du eine Überschneidung bei den vertauschten Spalten hast.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: So 30.11.08 15:20
Hallo,
deshalb fand ich es auch eine gute Idee, die Reihenfolge zu mischen, um zu mehr Varianten zu kommen.
Wie läuft den Dein Backtracking ab, Du wirst doch sicher nur aus den noch möglichen wählen. daher wundert mich etwas das Du 5000 Versuche von 4032 Möglichkeiten brauchst.
Gehtst Du strikt zeilen oder spaltenweise vor.
Ich würde anhand der Wahrscheinlichkeiten , also im ZickZack an der Nebendiagonale lang die Felder belegen.
Im Beispiel oben erst die 5 dann die 4er dann die 3 er...
Man hat bei mehr als der Hälfte überhaupt keine Möglichkeit der Auswahl
Quelltext 1: 2: 3: 4: 5: 6:
| Beispiel für n = 5 5 4 3 2 1 4 3 2 1 1 3 2 1 1 1 2 1 1 1 1 1 1 1 1 1 |
Hier könnte man vielleicht zwei Prozessoren benutzen:
Einer beginnt zeilenweise ab Zeile1 Spalte 1, der andere sobald Feld(1,1) belegt ist ab Zeile 2 die Spalte 1 runter.
Gruß Horst
P.S
Backtracking , sinnvolles Belegen ist sicher wesentlich schnellere Variante.
Statt genauso oft komplette Spalen/Zeilen zu tauschen.
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: So 30.11.08 15:47
Hey,
das Backtracking sieht so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| void delField(BOOL * feld, int n) { int i; for (i=0 ; i<n ; i++) feld[i] = FALSE; }
BOOL check(int * matrix, int index, int n, BOOL* tmp) { int i, j; int itmp; // checke die spalte: j = index%n; delField(tmp, n); for (i=0 ; i<n ; i++) { itmp = matrix[j]; if (itmp!=EMPTY) { if (tmp[itmp]==TRUE) { return FALSE; } tmp[itmp] = TRUE; j+=n; } else break; } i = index-index%n; delField(tmp, n); for (j=0 ; j<n ; j++) { itmp = matrix[i]; if (itmp!=EMPTY) { if (tmp[itmp]==TRUE) { return FALSE; } tmp[itmp] = TRUE; i++; } else break; } return TRUE; }
void genSolutions(int * matrix, int index, int n, int * result, BOOL * tmp) { int i; if (index==n*n) { (*result)++; } else { for (i=0 ; i<n ; i++) { matrix[index] = i; if (check(matrix, index, n, tmp)==TRUE) { genSolutions(matrix, index+1, n, result, tmp); } } matrix[index] = EMPTY; } } int getCount(int * matrix, int n) { int result = 0; BOOL * tmp = (BOOL*)malloc(n*sizeof(int)); genSolutions(matrix, 0, n, &result, tmp); free(tmp); return result; } |
Hoffe ihr könnt mir C was anfangen? Lazarus spinnt noch rum und ich hab ehrlich gesagt wenig Lust mich darum zu kümmern...
Die 5000 Vertauschungen waren Pi*Daumen gewählt, für kleine Matrizen wohl viel zu viel, für große wiederum nicht ausreichend...
Aber letztendlich ist doch der Fisher-Yates shuffle die Lösung, oder?
Die erste Zeile wird normal danach erstellt, bei den folgenden muss man dann halt alle Zahlen, die in der Spalte schon vorkommen, aus dem Feld streichen, wenn man das effizient macht sollte man für eine NxN-Matrix bei O(n²*log(n)) landen, oder?
edit: es soll natürlich "mit C" heißen, und zum Verständnis könnte
Quelltext 1: 2: 3: 4:
| #define EMPTY (-1) #define TRUE 1 #define FALSE 0 typedef int BOOL; |
auch noch ganz nützlich sein
edit2: betretenes Schweigen?
Sind da so gravierende Fehler drin, oder ist die Pointerarithmetik verwirrend?
Da Fisher-Yates irgendwie spannender als die Logikvorlesung ist hab ich gerade mal ausprobiert was passiert, wenn man mit Vertauschungen arbeitet, aber die nicht irgendwie zufällig wählt, sonst per Fisher-Yates, scheint relativ schnell und dabei auch noch zufällig zu sein
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| 4 3 7 9 5 1 0 6 2 8 5 4 8 0 6 2 1 7 3 9 9 8 2 4 0 6 5 1 7 3 1 0 4 6 2 8 7 3 9 5 7 6 0 2 8 4 3 9 5 1 3 2 6 8 4 0 9 5 1 7 2 1 5 7 3 9 8 4 0 6 8 7 1 3 9 5 4 0 6 2 6 5 9 1 7 3 2 8 4 0 0 9 3 5 1 7 6 2 8 4 |
Der noch nicht optimierte Code braucht für eine 2048x2048-Matrix ca. 600ms...
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mo 01.12.08 13:09
Hallo,
Dein Backtracking hat ja ersteinmal nur die Anzahl aller Lösungen gezählt, aber keine zufällige erzeugt.
Du wolltest doch nicht alle Varianten erzeugen und dann diesen eine zufällig auswählen.
Was ist an deiner Misch-Variante anders, wie oft tauschst Du Zeilen und Spalten.
Gruß Horst
P.S.
n=2048 1012 ms 1012 ms bei 2* (n-1) Tauschungen //wie gesagt erzeugt nicht alle Möglichkeiten (1700 Mhz PentiumM)
n=2048 ~16x3600 ms rund eine Minute (extrapoliert aus n = 512) bei 2* (n-1)^2 Tauschungen
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: Mo 01.12.08 13:49
Horst_H hat folgendes geschrieben : | Hallo,
Dein Backtracking hat ja ersteinmal nur die Anzahl aller Lösungen gezählt, aber keine zufällige erzeugt.
|
Jo, das war auch die Absicht
Die noch offene Frage ist ja, ob man jede gültige Anordnung durch das Tauschen von Zeilen und Spalten erzeugen kann (ich denke schon), und ob bei dieser Art der Erstellung alle möglichen Ergebnisse gleich wahrscheinlich sind (ich befürchte nicht...  )
Ich führe jetzt max n Spalten- und n Zeilenvertauschungen durch, der Unterschied ist dass ich die zu vertauschenen Indizes nicht mehr rein willkürlich wähle, sondern dafür eine durch Fisher-Yates generierte Permutation der Menge {1, .., n} nehme.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| t1 = fisher_yates_set(n); t2 = fisher_yates_set(n); t3 = fisher_yates_set(n); t4 = fisher_yates_set(n); for (i=0 ; i<n ; i++) { tauscheZeilen(matrix, t1[i], t2[i], n); tauscheSpalten(matrix, t3[i], t4[i], n); } |
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mo 01.12.08 14:13
Hallo,
dito, mach ich doch in der ersten Tausch Variante genauso, nur eben zusätzlich Tausch der Abfolge, welcher das Ergebnis nur selten ändert, weshalb die 2n! als Einfluß völlig daneben liegen, also berücksichtige ich das jetzt nicht mehr.
Dadurch verändert sich die Anzahl der Tauschen nicht.
Bleiben also n! x n! gegenüber SuperFac(n)  , ab und zu muss man neue Bezeichner einführen.
Aber dies erzeugt ab n= 5 zuwenig Varianten.
Quelltext 1: 2: 3: 4: 5: 6: 7:
| n n! Superfac n!^2 (2*n)! 1 1 1 1 2 2 2 2 4 24 3 6 12 36 720 4 24 288 576 40320 5 120 34560 14400 3628800 <-- nur 14400 von 34560 6 720 24883200 518400 479001600 |
Gruß Horst
P.S.
Mein Versuch mit zufälliger Belegung ist momentan ähnlich lahm wie die Version des Threaderstellers. Da ich eine die Zile die nicht zu Ende gebracht werden konnte neu zufällig belege.
Da muss ich noch eine Logik einbauen, die erkennt, das wenn ich aus den möglichen Zahlen eine gewisse jetzt auswähle ich in der nächsten Spalten irgendwann auf leere Menge komme.
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: Mo 01.12.08 14:47
Der Witz ist halt dass mein Backtracking für eine NxN-matrix schon 161280 Lösungen findet, keine Ahnung wie es zu der Zahl kommt.
Ich denke auch dass das Befüllen per Backtracking die "zufälligste" Möglichkeit ist, das Problem ist halt dass der Algorithmus nicht zwangsläufig terminiert und auch noch relativ langsam ist...
|
|
|