| Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann. |
Diskussion: das perfekte Labyrinth im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Es gibt sogenannte "perfekte" Labyrinthe - sie besitzen von einem beliebigen Punkt zum anderen genau einen Weg, es gibt ...
![]() |
| | #1 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Anzeige Es gibt sogenannte "perfekte" Labyrinthe - sie besitzen von einem beliebigen Punkt zum anderen genau einen Weg, es gibt also keine Schleifen oder unerreichbaren Stellen: Code: +-++-++-+ | || | + ++-++ + + ++-++ + | || | +-++ ++ + +-++ ++ + | | +-++-++-+ Hilfe zum Algorithmus 2. Damit es nicht so langweilig wird ;) , sollte das Programm sich noch 2 Punkte nehmen (zufällig oder vom Benutzer angeben lassen) und einen Lösungsweg dazwischen finden Code: S=Start,E=End und die "." markieren den Weg +-++-++-+ | ||E .| + ++-++ + + ++-++ + | ||.| +-++ ++ + +-++ ++ + | S| +-++-++-+ Hilfe zum Algorithmus 3.Ein Output (Konsole oder grafisch) wäre zur Kontrolle ganz gut. Beispiel Lasst euch nicht abschrecken - so groß ist die Aufgabe nicht (ca. 300 Zeilen C, wobei bei mir noch Speichern/Laden in einem bestimmten Format und paar Aspekte mehr implementiert wurden).
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #2 (permalink) |
| Registriert seit: 01.11.03 ![]() Likes: 0 | Ich würde folgende Darstellung bevorzugen, da sie imo besser zu lesen ist (zwei Zeichen für eine Breite, damit es in diesem Fall 10x10 auch in etwa quadratisch ist): Beispiel-Darstellung Außerdem würde mich das Format, in dem du die Daten speicherst interessieren, da große Labyrithe so bei 500x500 nicht gerade leicht zu überprüfen sind, und wohl kaum irgendjemand sowas ließt^^ und man dann so ein einheitliches Format hat... |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) | ||
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Zitat:
Zitat:
Ich hatte die Vorgabe (ja, es war eine Übungsaufgabe 3,3 weitere Zeilen war jeweils eine "Zeile" aus dem Labyrinth - die Zellen in Dezimaldarstellung. Also z.B 3,3 11,9,3 10,10,10 12,6,14 Das wollte ich keinem antun Obwohl Textformat bei den ganzen genutzten Sprachen wohl am kompatibelsten wäre. Wie wäre es damit: Format: ASCII (Java &Co User können auch bei Unicode bleiben, nur dann kurz hinschreiben - die anschließende ASCII Konvertierung sollte jeder vernünftige Texteditor schaffen). Darstellung einer einzelnen Zelle: Dezimale Zahl. Codierung: (hab gerade etwas gegoogelt: die "gängigeren" Sprachen, die mir eingefallen sind, unterstützen bitweise Operatoren - c#/java/perl/PHP/pascal/c usw. - also gibt es keine Ausreden, sich nicht damit zu beschäftigen Für jede existierende Wand gibt es ein gesetztes Bit. Wand oben gesetzt: 0001b Wand rechts gesetzt: 0010b Wand unten gesetzt: 0100b Wand links gesetzt: 1000b Damit repräsentiert z.B die Zahl 15 eine Zelle, dessen Wände noch alle "ganz" sind, 1 ist eine Zelle, die eine obere Wand hat, 3 ist eine Zelle, dessen obere und rechte Wand gesetzt sind usw. Wenn ich gerade keinen Denkfehler hab, sollte es auch OS/Plattformunabhängig sein. Gesamtformat: erste Zeile: eine Größenangabe (Dezimal, getrennt durch Komma) folgende: jeweils eine Zeile aus dem Labyrinth, repräsentiert durch eine Zahl, getrennt durch Kommata. Beispiel (so sieht das Labfile in einem Texteditor aus) 3,3 11,9,3 10,10,10 12,6,14 was als Labyrinth so ausschaut: Code: +-++-++-+ | || | + ++ ++ + + ++ ++ + | || || | + ++ ++ + + ++ ++ + | || | +-++-++-+ Bitweise Operatoren - per "and" (bitweisem natürlich) kann man feststellen, ob eine Wand gesetzt ist. Per bitweisem "or" kann man einzelne Informationen reinschreiben: Zahl=0 Zahl "bitweises or" 1 => obere Wand setzen Zahl "bitweises or" 8 => linke Wand setzen Zahl=lese Zahl aus Datei Zahl "bitweises and" 1 ->ungleich 0 => obere Wand ist gesetzt Zahl "bitweises and" 8 -> ungleich 0 => linke Wand ist gesetzt
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | ||
| | |
| | #4 (permalink) |
| Registriert seit: 01.11.03 ![]() Likes: 0 | aha... was mich jetzt bloss wundert, ist dass du ja für alle inneren Wände je 2 bit hast... etwas überflüssig naja, ich hatte es so gemacht, dass sozusagen jede Zelle zwei bit hat: Wand links / Wand unten sind zwar immernoch zuviele bits... :] Aber sonst ist das Format gut... werds wohl mal aufnehmen... muss nur noch(tm) einen Weg S zu E berechnen... Wie groß kann dein Labyrinth eigentlich werden? |
| | |
| | #5 (permalink) | ||
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Zitat:
Anderseits erscheint es logischer bei der Konstruktion oder Wegsuche: z.B zwei Zellen: linke Zelle hat keine obere und keine rechte Wand, die rechte Zelle keine linke und keine untere Wand und bildet damit eine "Eckdurchgang" (Zugang von oben, dann nach rechts gehen und nach unten. Wie willst Du diese Situation mit nur 2 Bits informationen abspeichern? Code: _ |_ | Zitat:
gcc unter Windows: irgendwo knapp über 100x100 ist Schluss lcc32: irgendwo nach 300x300 gcc unter Knoppix 3.4: imho ging es bis 1000x1000 - was ich sehr erfreulich fand
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | ||
| | |
| | #6 (permalink) | |
| Registriert seit: 16.08.06 ![]() Likes: 0 | Zitat:
| |
| | |
| | #7 (permalink) | |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Zitat:
Je nach Compiler werden afaik auch per Default unterschiedliche Stack-Größen reserviert. Man könnte hier ein wenig mit den Einstellungen spielen. Aber sowohl die Erstellung wie auch die Lösung des Labyrinths sind bei mir rekursiver Natur - da geht irgendwann eben der Speicher aus.
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | |
| | |
| | #8 (permalink) | |
| Registriert seit: 16.08.06 ![]() Likes: 0 | Zitat:
Hier eine unsaubere (für Leute die keine Zeit haben :-) : so wird es nicht gemacht | |
| | |
| | #9 (permalink) |
| Registriert seit: 01.11.03 ![]() Likes: 0 | Also ich hab nichts am Programm geändert (auch rekursiver Ansatz) und kann Labyrinthe von 7000x7000 erstellen (dauert eine knappe halbe Minute, wird mit Schleifen nicht ganz so schnell gehen, imo [oder es braucht auch Unmengen an Speicher]). Zeitweise braucht das Programm dann zwar fast ein GB, aber egal... Unter Linux kann es sein, dass mit "ulimit -s" eine Stack-Beschränkung gesetzt wurde. Bei Gentoo war das standardmäßig bei 8MB ... Softlimit kann mit "ulimit -S -s 300000" auf 300 MB gesetzt werden... Die Konsolen-Ausgabe ist auch knapp 370 MB groß... (wenn das einer haben will^^ gepackt wirds wohl nichtmehr soooo groß sein) und da ich die letzten Tage unter anderem knapp 550 km weiter im Süden war, bin ich erst heute wieder hierzu gekommen ... |
| | |
| | #10 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Ok, hab ein bisschen in der DJGPP Dokumentation gelesen. Die Stackgröße kann man per globalvariable ändern. unsigned _stklen = 1048576; Denn standardmäßig soll sie auf 512KB beschränkt sein. Auf "sichere" 100 MB erhöht, konnte ich 4000x4000 Labyrinthe testen (größere dauern mit zu lange - da ich sofort das erstellte Labyrinth erstmal ausgebe So, hier ist erstmal eine Lösung. Sollte mit Lcc32 bzw. gcc auf Windows kompilierbar sein. Zusätzlich auf Knoppix 3.4 getestet. Wer ein anders OS nutzt, muss eventuell zuerst die Headerdatei anpassen (die OS spezifischen Definitionen um ein einheitliches Clearscreen zu implementieren )Wer "übergroße" Labyrinthe testen mag, sollte selbst für die nötigen Stackeinstellungen sorgen. Dass C nicht meine Lieblingssprache ist, merkt man wahrscheinlich schnell Der Codestil ist etwas gewöhnungsbedürftig - aus mir inzwischen unerklärlichen Gründen habe ich die Namensgebung der Funktions/Variablennamen auf den deutschen Sprachraum beschränkt. Edit: die Binarys drangehängt: einmal eine Exe für Windows und einmal einen "ELF", der unter Knoppix 3.4 erstellt wurde
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #11 (permalink) |
| Registriert seit: 16.08.06 ![]() Likes: 0 | Ich hoffe doch, dass die Programmieraufgabe mit dem Posten einer Lösung noch nicht als gelöst gilt. Schliesslich besitzt sie einen interessanten Nebenaspekt. Offenbar ist die maximale Labyrinthgrösse plattform- und / oder kompilerabhängig. Das kann aber nicht sein, da Algorithmen immer plattform- und kompilerunabhängig arbeiten. Was also muss geändert werden um Labyrinthe zu generieren, die 100.000 * 100.000 Felder gross sind ? |
| | |
| | #12 (permalink) | ||
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Zitat:
Zitat:
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | ||
| | |
| | #13 (permalink) |
| Registriert seit: 01.11.03 ![]() Likes: 0 | Mittlerweile kann ich auch ein Labyrinth lösen und speichern... fehlt nur noch das laden... gelöstes Labyrinth @merker: Und vom Algorithmus her. Der ist an sich durch die Speichergröße der verwendeten Datentypen und dem zur Verfügung stehenden Speicher begrenzt. An sich also wie CDW sagte, keine Beschränkung des Algorithmus. Allerhöchstens eine Beschränkung der Implementierung / Betriebssystems... Hast du eigentlich schon eine Lösung mit Schleifen? Im Grunde geht es, klar, aber bei großen Labyrinthen hatte mein Algorithmus ein Problem: Wie finde ich noch nicht zugängliche Zellen, und das möglichst zufällig... @CDW: Diese Schleife "while (nachbar_versuche!=NORD+WEST+OST+SUED)" wird manchmal doppelt so häufig durchlaufen, wie nötig. (nachbar_versuche wird geändert, wenn der nachbar nichtmehr frei ist, also bei dem zweiten versuch) . Und manchmal ziemlich oft^^ (je nach dem, was rand()%4 liefert...) Das bei mir mehr Speicher gebraucht wird, könnte an den 64bit liegen denn wieviele pointer müssen gesichert werden?!... |
| | |
| | #14 (permalink) |
| Registriert seit: 29.01.06 ![]() Likes: 0 | Hier ein Labyrinth von meinem Programm: Code: ########################################## ##:: ::##:: ::##:: ::##:: :: ::## ## ###### ## ## ## ## ## ###### ## ## ## ##:: ::##:: ::##::##::## ##::## ## ## ################## ## ## ## ## ## ## ##:: :: ::##::## ##::## ## ## ########## ########## ## ## ## ## ##:: ::##:: ::## ## ::##:: ::## ## ## ## ## ###### ## ## ## ###### ## ##::##:: ::## ##::##:: ::## ## ## ########## ########## ###### ## ## ##:: ::## ## ##::## ##:: ::## ###### ## ###### ###### ## ###### ## ##:: ::## ##:: ::## ::## ## ############## ## ############## ## ##:: :: :: ::## ##:: :: :: ::##::## ############## ########## ###### ## ## ## ## ##:: :: ::## ##::##::## ## ## ## ########## ########## ## ## ## ## :: :: :: ::##::## ########################################## cya xsheep |
| | |
| | #15 (permalink) | |
| Registriert seit: 16.08.06 ![]() Likes: 0 | Huch ! (Teil 1) Ihr seid mir alle zu schnell :-). Deshalb hier ein Test für den Algorithmus : Testlauf @lagalopex Zitat:
+E+D+I+T+1+ Huch ! (Teil 2) Hoffentlich ist das Interesse an dieser Aufgabe noch nicht verschwunden. Deshalb erst mal ein bischen angeben (siehe Anhang :-). Meine nichtrekursive Lösung schafft ohne besondere Linkereinstellungen locker 8000 * 8000 grosse Labyrinthe. Allerdings braucht mein Rechner (Celeron,350MHz,RAM 64MB, FP 6 GB) dafür bereits mehrere Minuten. Die Maximalgrösse ist nur begrenzt durch folgenden Ausdruck : ((4,75 * x_sz * y_sz) < 4 GB). Und hier wird die Aufgabe wieder interessant : Wie lässt sich beweisen, dass ein "sehr" grosses Labyrinth auch wirklich "ok" ist ? Ausdrucken läuft nicht. Nur Vertrauen haben in die eigene Implementation ist inakzeptabel. Irgendwelche Ideen ? | |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Perfekte Distribution? | kalil1234 | Linux/UNIX | 6 | 12.04.07 14:12 |
| die perfekte Maus | ghostdog | Hardware Probleme | 25 | 20.07.05 08:18 |
| Labyrinth | Nornagest | Programmieraufgaben | 10 | 19.10.04 15:49 |