Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
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.

das perfekte Labyrinth

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 ...

Antwort
Alt 25.08.06, 13:29   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard das perfekte Labyrinth

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:
+-++-++-+
| ||    |
+ ++-++ +
+ ++-++ +
|    || |
+-++ ++ +
+-++ ++ +
|       |
+-++-++-+
1.Euer Programm soll rechteckige, perfekte Labyrinthe beliebiger Größe erzeugen (möglichst zufällige und nicht nur "Schneckenlabyrinthe" ;) )
Hilfe zum Algorithmus   

Man nehme an, jede Zelle hätte 4 Wände. Am Anfang sind bei jeder Zelle alle Wände aufgerichtet und die Zellen somit voneinander getrennt.

Jetzt wird eine Zelle zufällig ausgewählt und der Algorithmus verbindet Schritt für Schritt die aktuelle Zelle mit einer unbesuchten Nachbarzelle (dabei die entsprechenden Wände entfernen).

Das wird dann solange gemacht, bis keine unbesuchte Zelle mehr übrig ist.

Weitere Stichworte: Tiefensuche und Backtracking.


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   

Hier sind wieder Tiefensuche mit Backtracking angesagt - zumindest liefert das recht schnell eine Lösung ;)
Man probiert also (rekursiv) alle Richtungen aus und merkt sich bei Erfolg den Weg



3.Ein Output (Konsole oder grafisch) wäre zur Kontrolle ganz gut.
Beispiel   

Code:
+-++-++-++-++-++-++-++-++-++-+
|             ||       ||    |
+ ++-++-++-++ ++ ++-++ ++ ++ +
+ ++-++-++-++ ++ ++-++ ++ ++ +
|       ||       || || || || |
+ ++-++ ++-++-++-++ ++ ++-++ +
+ ++-++ ++-++-++-++ ++ ++-++ +
|    || ||.  .  .||          |
+-++-++ ++ ++-++ ++-++-++-++ +
+-++-++ ++ ++-++ ++-++-++-++ +
|.  .||.  .|| ||.  .||    || |
+ ++ ++ ++-++ ++-++ ++ ++-++ +
+ ++ ++ ++-++ ++-++ ++ ++-++ +
|.||.||.  .||.  S||.||    || |
+ ++ ++-++ ++ ++ ++ ++-++ ++ +
+ ++ ++-++ ++ ++ ++ ++-++ ++ +
|.||.||   .  .|| ||.  .||    |
+ ++ ++-++-++-++-++-++ ++ ++-+
+ ++ ++-++-++-++-++-++ ++ ++-+
|E||.  .  .  .  .  .  .||    |
+-++-++-++-++-++-++-++-++-++-+

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.
CDW ist offline   Mit Zitat antworten
Alt 27.08.06, 18:39   #2 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

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   
Code:
##########################################
##      ##                          ##  ##
##  ######  ##############  ######  ##  ##
##          ##      ##      ##      ##  ##
##  ##############  ##  ######  ######  ##
##                  ##  ##  ##      ##  ##
######  ##########  ##  ##  ######  ##  ##
##      ##      ##  ##  ##      ##      ##
##  ######  ##  ######  ##  ##  ######  ##
##      ##  ##      ##  ##  ##          ##
##########  ######  ##  ##########  ######
##          ##          ##      ##  ##  ##
##  ######################  ##  ##  ##  ##
##                          ##  ##      ##
##  ##########################  ######  ##
##  ##      ##              ##  ##      ##
##  ##  ##  ##  ##  ######  ##  ##  ######
##  ##  ##  ##  ##      ##  ##  ##  ##  ##
##  ##  ##  ##########  ##  ##  ######  ##
##      ##              ##  ##          ##
##########################################

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...
lagalopex ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 27.08.06, 19:32   #3 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Zitat:
Ich würde folgende Darstellung bevorzugen
Also Darstellung war nur ein Beispiel - mir war nichts besseres eingefallen und ich fand die Darstellung jeder einzelnen Zelle am einfachsten (und in der Console bzw. bei einem entsprechenden Font sieht das auch imho besser aus ). Außerdem kann man auch eine grafische Ausgabe machen - mit Bildchen oder gezeichneten Linien

Zitat:
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...
hm, ich habe mir gedacht, dass es doch recht sprach und implementierungsspezifisch wäre.

Ich hatte die Vorgabe (ja, es war eine Übungsaufgabe ), die einzelnen Wände jeder Zelle mit jeweils einem gesetzten Bit zu kodieren, so dass ensprechend die Zellen verschiedene Werte hatten: 0 bis 15 (Binär eben 0001 bis 1111). Zusätzlich musste das Programm ein Labyrinth in "lesbarer" Form speichern: 1. Zeile wurde die Größe gespeichert:
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:
+-++-++-+
| ||    |
+ ++ ++ +
+ ++ ++ +
| || || |
+ ++ ++ +
+ ++ ++ +
|    || |
+-++-++-+
Wie man eine Dezimalzahl erstellt bzw. aus der Zahl informationen ausliest:
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.
CDW ist offline   Mit Zitat antworten
Alt 27.08.06, 21:01   #4 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

aha... was mich jetzt bloss wundert, ist dass du ja für alle inneren Wände je 2 bit hast... etwas überflüssig und dass immer außen immer Wände sind...

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?
lagalopex ist offline   Mit Zitat antworten
Alt 27.08.06, 21:14   #5 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Zitat:
ha... was mich jetzt bloss wundert, ist dass du ja für alle inneren Wände je 2 bit hast... etwas überflüssig
Naja, das Format war Vorgabe (man musste alle Wände mit einem Bit kodieren ).

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:
Wie groß kann dein Labyrinth eigentlich werden?
ich hab festgestellt, dass es sehr Compilerabhängig ist:
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.
CDW ist offline   Mit Zitat antworten
Alt 28.08.06, 02:38   #6 (permalink)
 
Registriert seit: 16.08.06
merker Leistung: Facit NTK
Likes: 0
Standard

Zitat:
ich hab festgestellt, dass es sehr Compilerabhängig ist:
gcc unter Windows: irgendwo knapp über 100x100 ist Schluss
lcc32: irgendwo nach 300x300
Wie kommt das ?!? Gab es irgendwelche Fehlermeldungen ?
merker ist offline   Mit Zitat antworten
Alt 28.08.06, 02:49   #7 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Zitat:
Wie kommt das ?!? Gab es irgendwelche Fehlermeldungen ?
Lcc32 Kompilat: "Software Fehlercode 0xFD" aufgetreten (im Olly kann man "StackOverflow" Excetion" bewundern). Der Gcc kompilat unter Windows (DJGPP) beendet sich entweder komplett ohne Meldung oder reagiert nicht mehr.Die Meldung unter Knoppix weiß ich nicht mehr - afaik ging das auch Richtung Stackoverflow.

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.
CDW ist offline   Mit Zitat antworten
Alt 28.08.06, 15:55   #8 (permalink)
 
Registriert seit: 16.08.06
merker Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Man könnte hier ein wenig mit den Einstellungen spielen.
Das ist die einzig saubere Lösung.

Hier eine unsaubere (für Leute die keine Zeit haben :-) :
so wird es nicht gemacht   

Patch doch einfach den EXE-Header :

1. Suche nach 'PE'

2. Von dort :

PE + Offset 0x60 -> SizeOfStackReserve
PE + Offset 0x64 -> SizeOfStackCommit
PE + Offset 0x68 -> SizeOfHeapReserve
PE + Offset 0x6C -> SizeOfHeapCommit

Patch dort die gewünschte Stack-Grösse rein.

Faustregel :

Default + ((SummeLokalerVariablen+80) * Rekursionstiefe)
Allerdings lässt sich das Labyrinthproblem auch ohne Rekursion lösen. Ich zumindest habe lieber einen "OutOfMemory" anstatt den in jeder Hinsicht fatalen "StackOverflow".
merker ist offline   Mit Zitat antworten
Alt 30.08.06, 19:12   #9 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

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 ...
lagalopex ist offline   Mit Zitat antworten
Alt 30.08.06, 23:11   #10 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

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
Angehängte Dateien
Dateityp: zip Lab.zip (3,1 KB, 108x aufgerufen)
Dateityp: zip binarys.zip (15,6 KB, 82x aufgerufen)
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 31.08.06, 03:36   #11 (permalink)
 
Registriert seit: 16.08.06
merker Leistung: Facit NTK
Likes: 0
Standard

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 ?
merker ist offline   Mit Zitat antworten
Alt 31.08.06, 03:45   #12 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Zitat:
einer Lösung noch nicht als gelöst gilt.
Nein, ist sie nicht - eine Lösung kann allerdings einige Denkansätze liefern, falls jemand nicht weiterkommt.

Zitat:
Das kann aber nicht sein, da Algorithmen immer plattform- und kompilerunabhängig arbeiten.
Die Implementierungen dieser Algorithmen sind aber plattform/kompilerabhängig, da sie letzendlich darauf laufen müssen, ich sehe hier keinen Widerspruch
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 31.08.06, 16:20   #13 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

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?!...
lagalopex ist offline   Mit Zitat antworten
Alt 31.08.06, 17:18   #14 (permalink)
 
Registriert seit: 29.01.06
xsheep Leistung: Facit NTK
Likes: 0
Standard

Hier ein Labyrinth von meinem Programm:

Code:
##########################################
##::  ::##::  ::##::  ::##::  ::  ::##  ##
######  ##  ##  ##  ##  ##  ######  ##  ##
##  ##::  ::##::  ::##::##::##  ##::##  ##
##  ##################  ##  ##  ##  ##  ##
##          ##::  ::  ::##::##  ##::##  ##
##  ##########  ##########  ##  ##  ##  ##
##::  ::##::  ::##  ##    ::##::  ::##  ##
##  ##  ##  ######  ##  ##  ##  ######  ##
##::##::  ::##          ##::##::  ::##  ##
##  ##########  ##########  ######  ##  ##
##::  ::##  ##          ##::##  ##::  ::##
######  ##  ######  ######  ##  ######  ##
##::  ::##          ##::  ::##        ::##
##  ##############  ##  ##############  ##
##::  ::  ::  ::##  ##::  ::  ::  ::##::##
##############  ##########  ######  ##  ##
##  ##      ##::  ::  ::##      ##::##::##
##  ##  ##  ##########  ##########  ##  ##
##      ##            ::  ::  ::  ::##::##
##########################################
Mein Programm beherrscht das Speichern/Laden, Generieren und Lösen von Labyrinthen. Das einzige Problem: nach 300x300 macht es schlapp, kA wieso.

cya xsheep
xsheep ist offline   Mit Zitat antworten
Alt 01.09.06, 13:25   #15 (permalink)
 
Registriert seit: 16.08.06
merker Leistung: Facit NTK
Likes: 0
Standard

Huch ! (Teil 1)

Ihr seid mir alle zu schnell :-).

Deshalb hier ein Test für den Algorithmus :
Testlauf   

1. Der manipulierte Zufallsgenerator

Die Implementation des Algorithmus muss sich auch ordnungsgemäss beenden, wenn er folgendes generiert :

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 oder
1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 oder
1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1 oder (...)

2. Das rechte Randgruppenproblem

Technisch gesehen existieren keine mehrdimensionalen Arrays. Dimensionen sind nur eine Frage der Zählweise :

Testlauf   

Code:
MyArray [3][4]

x   : 1   2   3   4
y   : 1234123412341234
ram : 123456789.......

MyArray[1][7] == MyArray[2][3]

-> Zugriff über die rechte Kante generiert keine Zugriffsverletzung !

Es muss "PerHand" ausgeschlossen sein, dass inkonsistente Daten entstehen.


@lagalopex

Zitat:
Wie finde ich noch nicht zugängliche Zellen, und das möglichst zufällig...
Das geht in dem man sich bei "step_forward" sämtliche freien Richtungen merkt. Dann liegen sie bei "step_back" wieder vor.


+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 ?
merker ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » das perfekte Labyrinth
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

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


Ä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


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