Dreidimensionalen Array abfragen



  • @Patrick_P sagte in Dreidimensionalen Array abfragen:

    Ich hab jetzt erst seit 2 Semster Informatik

    Erst?????
    Das konnte ich mir jetzt nicht verkneifen 🙂



  • @Mechanics sagte in Dreidimensionalen Array abfragen:

    @Patrick_P sagte in Dreidimensionalen Array abfragen:

    Ich hab jetzt erst seit 2 Semster Informatik

    Erst?????
    Das konnte ich mir jetzt nicht verkneifen 🙂

    Hatte/Hab nur alle 2 Wochen ã 1,5 Std Vorlesung, deswegen Erst 😃



  • Hä, ich raffs net. Für mich ist das eine Mathe Aufgabe. Kannst du Ausgabenbeispiele machen? Also wenn ich X Eingabe soll Y angezeigt werden...



  • Ich denke, es ist was wie ein 3D-Tetris mit Kisten/Paketen... Wenn ein Paket reinkommt, soll der verbliebene Platz für weitere Pakete angezeigt werden.



  • Der Inhalt eines Informatik-Studiums ist nicht ausschließlich "Programmieren". Das kommt zwar auch vor, aber ist ja nur ein kleiner Teil. Programmieren lernt man nur durch viel Praxis. Nur Übungsaufgaben reichen nicht.

    @out: ich denke, wenn es ein paar mehr Pakete sind in der Kiste, muss man ggf. durchprobieren/umsortieren, um mehr Platz zu schaffen. Wenn die Pakete alle Quader sind, ist die Aufgabe bestimmt leichter als wenn beliebige Paketformen zugelassen sind. Da man Pakete auch wieder entfernen können soll, muss man hier ggf. andere, darüber liegende Pakete zuerst entfernen und danach wieder reinlegen (die liegen dann ggf. tiefer). Ich denke zumindest, dass die Aufgabe in die Richtung geht, auch wenn das so bislang von @Patrick_P noch nicht formuliert wurde.



  • Ich Studiere Maschinenbau und wir kratzen da leider nur an der Oberfläche.

    Mal ein Beispiel in 2D

    Kiste leer.      Paket 1.         Paket 2. 
    0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
    0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
    0 0 0 0 0 0     0 0 0 0 0 0     0 0 2 2 2 0
    0 0 0 0 0 0     0 0 0 0 0 0     0 0 0 0 0 0
    

    Paar Pakete würden ja noch rein passen und falls das neue Paket zu groß ist oder keinen Platz mehr haben sollte
    cout >> "Das Paket passt nicht mehr in die Kiste" ; kommen

    Paket 1 löschen 
    0 0 2 2 2 0
    0 0 2 2 2 0
    0 0 2 2 2 0 
    0 0 0 0 0 0
    

    Pakete müssen dann nicht auf gerückt werden, die bleiben an der Stelle stehen und müssen nicht gedreht werden falls es doch passen würde.



  • Programmier das doch erstmal in 1D. Wenn das funktioniert und du verstehst wie es geht, ist das erweitern auf 2D und dann 3D ein Klacks.

    Und schmeiss deinen unlesbaren Code weg. Danke.



  • Die Probleme sind ja schon genannt worden: Absolut keine Abstraktion mit Hilfe einer geeigneten Struktur und die Hauruckmethode, alles in dieser einen Funktion machen zu wollen. Wenn du für das Problem unterteilst, schreibt sich das Programm fast von alleine.
    Minimalbeispiel für eine 3D-Arrayklasse:

    template<typename T, class C=std::vector<T>>
    class Arr3D
    {
    public:
    	Arr3D(size_t w=1, size_t h=1, size_t d=1, const T& fill=T())
                : m_width(w), m_height(h), m_depth(d), m_data(w*h*d, fill)
    	{ }
    	const T& Get(size_t x, size_t y, size_t z) const {
    		return m_data[index(x, y, z)];
    	}
    	void Set(size_t x, size_t y, size_t z, const T& val) {
    		m_data[index(x, y, z)]=val;
    	}
    	void Fill(const T& fill=T()) {std::fill(m_data.begin(), m_data.end(), fill);}
    	size_t GetWidth() const	{return m_width;}
    	size_t GetHeight() const {return m_height;}
    	size_t GetDepth() const {return m_depth;}
    private:
    	size_t index(size_t x, size_t y, size_t z) const {
    		assert(x<m_width && y<m_height && z<m_depth);
    		return x+m_width*(y+m_height*z);
    	}
    	size_t m_width, m_height, m_depth;
    	C m_data;
    };
    

    Das ist halt wirklich das abolute Minimum. Aber so hat man zumindest Gewissheit, nicht über Arraygrenzen hinaus zu lesen oder zu schreiben. Es könnte noch erweitert werden, dass auch in der Releaseversion die Grenzen gecheckt werden. Bei dem C-Array wird ggf. eine OS-Exception ausgelöst oder du überschreibst eigene Stack-Variablen und das Programm crasht, wenns blöd läuft, an einer ganz anderen Stelle.
    Dann noch die vielen direkt gecodeten Konstanten. Du kannst ja mal nachzählen, an wievielen Stellen du diesen kurzen Code ändern müsstest, wenn sich die Dimension der Box ändern soll. Gleiches gilt auch für das '.'-Zeichen.
    Und eben unterteilen:
    Ob ein Paket in eine Ebene passen könnte, lässt sich schon schnell ermitteln, indem alle freien Plätze in der Ebene gesucht werden. Nur wenn die Anzahl größer gleich Paketbreite x Pakettiefe ist, kann es überhaupt passen.
    Dann die Indizes bestimmen, bis einem etwas Besseres einfällt, könnte man einfach von einem Index aus in x-, y- und z-Richtung schauen. Netter Nebeneffekt: Wenn die Grenze der y-Richtung auf 0 gesetzt wird, kann auch kein Paket unter ein bereits Eingefügtes gelegt werden. Wenn alle drei Bedingungen erfüllt sind, kann das Paket platziert werden und mit dem nächsten fortgefahren werden.
    Wenn du für jeden Schritt eine Funktion schreibst, die für sich nicht viel macht, dafür aber korrekt arbeitet, ließe sich das Programm auch noch zu einem späteren Zeitpunkt erweitern und verbessern.



  • @Patrick_P Du solltest (mit Whitespace) formatierten Text mit Code-Tags versehen, damit die Leerzeichen auch erhalten bleiben.

    @Patrick_P sagte in Dreidimensionalen Array abfragen:

     0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
     0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
     0 0 0 0 0 0     0 0 0 0 0 0     0 0 2 2 2 0
     0 0 0 0 0 0     0 0 0 0 0 0     0 0 0 0 0 0
    


  • @yahendrik Danke für das Beispiel 🙂
    Läuft aber noch nicht ganz bei mir, weil paar #include gefehlt haben und noch ein paar errors vorhanden sind.

    @DirkB Habe ich geändert, danke 😉


Anmelden zum Antworten