Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Rätsel mit 7 mal 6 Ecken

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.05.2003, 16:14 Uhr
Christian
C/C++ Master
(Operator)


Hallo Forum!

Gegeben sind 7 regelmäßige Sechsecke.
Unter www.christiankonrad.de/sonstiges/raetsel.html kann man sich die Teile ansehen. Die Teile werden zu der Figur ganz unten auf der gelinkten Seite zusammengebaut, allerdings dürfen nur Ecken, die die gleiche Farbe haben, zueinander gelegt werden.



Frage:
======

Wie viele verschiedene Möglichkeiten gibt es diese Figur zusammen zu bauen?
Wie sehen diese Lösungen aus?

Viel Spass,

Grüße, Christian
--
Grüße, Christian

Dieser Post wurde am 25.05.2003 um 16:19 Uhr von Christian editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.05.2003, 19:53 Uhr
~0xdeadbeef
Gast


Es gibt eine eindeutige Lösung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.05.2003, 20:31 Uhr
Christian
C/C++ Master
(Operator)


So, welches Teil muss denn in der Mitte liegen?
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.05.2003, 21:20 Uhr
~0xdeadbeef
Gast


Vermutlich das, das bei der Musterlösung auch in der Mitte liegt. Kann wirklich nur ein bestimmtest Teil in der Mitte liegen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.05.2003, 10:21 Uhr
virtual
Sexiest Bit alive
(Operator)


Also wenn man berücksichtigt, daß das 1 und 7 Sechseck identisch ist, dann gibt es wirklich nur eine Lösung, was folgendes Programm demonstriert
(Sorry für saumässigen Stil):

C++:
#include <iostream>
#include <algorithm>

// Definition eines einzelnen Puzzleteils
class SechsEck
{
public:
    enum FARBE { SCHWARZ, WEISS, ROT, BLAU, GRUEN, GELB  };

private:
    FARBE s[6];

public:
    SechsEck() {};
    SechsEck(FARBE s1, FARBE s2, FARBE s3, FARBE s4, FARBE s5, FARBE s6)
    {
        s[0] = s1;  s[1] = s2; s[2] = s3;
        s[3] = s4;  s[4] = s5; s[5] = s6;
    };

    int finde(FARBE f) const { for(int i=0; i<6; ++i) if (s[i]==f) return i; return -1; };

    FARBE operator[] (int i) const { return s[i%6]; };

    void zeige(int richtung) const
    {
        std::cout<<"(";
        for(int i=richtung; i<6+richtung; ++i)
        {
            FARBE f = operator[](i);
            if (i!=richtung) std::cout<<", ";
            switch (f)
            {
            case SCHWARZ: std::cout<<"schwarz"; break;
            case WEISS: std::cout<<"weiss"; break;
            case ROT: std::cout<<"rot"; break;
            case BLAU: std::cout<<"blau"; break;
            case GRUEN: std::cout<<"grün"; break;
            case GELB: std::cout<<"gelb"; break;
            }
        }
        std::cout<<")"<<std::endl;
    }
};

// Das ganze Puzzle
class Puzzle
{
private:
    SechsEck teile[7];
public:
    Puzzle()
    {
        teile[0] = SechsEck(SechsEck::WEISS, SechsEck::ROT, SechsEck::GRUEN,
                            SechsEck::BLAU, SechsEck::SCHWARZ, SechsEck::GELB);
        teile[1] = SechsEck(SechsEck::BLAU, SechsEck::SCHWARZ, SechsEck::ROT,
                            SechsEck::GRUEN, SechsEck::GELB, SechsEck::WEISS);
        teile[2] = SechsEck(SechsEck::GRUEN, SechsEck::BLAU, SechsEck::GELB,
                            SechsEck::SCHWARZ, SechsEck::WEISS, SechsEck::ROT);
        teile[3] = SechsEck(SechsEck::GRUEN, SechsEck::BLAU, SechsEck::ROT,
                            SechsEck::GELB, SechsEck::WEISS, SechsEck::SCHWARZ);
        teile[4] = SechsEck(SechsEck::GELB, SechsEck::BLAU, SechsEck::ROT,
                            SechsEck::GRUEN, SechsEck::WEISS, SechsEck::SCHWARZ);
        teile[5] = SechsEck(SechsEck::GRUEN, SechsEck::BLAU, SechsEck::WEISS,
                            SechsEck::SCHWARZ, SechsEck::ROT, SechsEck::GELB);
        teile[6] = SechsEck(SechsEck::GELB, SechsEck::WEISS,  SechsEck::ROT,
                            SechsEck::GRUEN, SechsEck::BLAU, SechsEck::SCHWARZ);
    };

    const SechsEck& operator[] (int i) const { return teile[i]; };

};

// Der Algo
class PuzzleLeger
{
private:
    const Puzzle& puzzle;
public:
    PuzzleLeger(const Puzzle& p) :puzzle(p) { };

    void zeige_loesung(int teile[7], int richtung[6]) const
    {
        static int anzahl = 0;

        std::cout << "Lösung "<<(++anzahl)<<std::endl;
        std::cout << "Sechseck in der Mitte ("<<teile[0]<<"): "; puzzle[teile[0]].zeige(0);
        std::cout << "Sechseck ganz oben    ("<<teile[1]<<"): "; puzzle[teile[1]].zeige(richtung[0]);
        std::cout << "Sechseck rechts oben  ("<<teile[2]<<"): "; puzzle[teile[2]].zeige(richtung[1]);
        std::cout << "Sechseck rechts unten ("<<teile[3]<<"): "; puzzle[teile[3]].zeige(richtung[2]);
        std::cout << "Sechseck unten        ("<<teile[4]<<"): "; puzzle[teile[4]].zeige(richtung[3]);
        std::cout << "Sechseck links unten  ("<<teile[5]<<"): "; puzzle[teile[5]].zeige(richtung[4]);
        std::cout << "Sechseck links oben   ("<<teile[6]<<"): "; puzzle[teile[6]].zeige(richtung[5]);
    };
    void lege() const
    {
        int teile[7];
        for(int i=0; i<7; ++i) teile[i] = i;

        // Gehe jede Permutation durch, teile[0] bezeichnet das mittlere Sechseck
        do
        {
            bool alles_passt = true;
            int richtung[6] = {0,0,0,0,0,0};
            for(int i=0; i<6 && alles_passt; ++i)
            {
                SechsEck::FARBE mitte = puzzle[teile[0]][i];
                // Drehe Teil i so, daß es mit Mitte passt
                richtung[i] = puzzle[teile[i+1]].finde(mitte);

                // Wenn nicht erste Teil, dann weitere Tests
                if (i>0)
                {
                    alles_passt = puzzle[teile[i]][richtung[i-1]+5] ==
                                  puzzle[teile[i+1]][richtung[i]+1];
                    // Wenn letztes Teil, dann zusätzlicher test
                    if (alles_passt && i==5)
                    {
                        alles_passt = puzzle[teile[1]][richtung[0]+1] ==
                                      puzzle[teile[6]][richtung[5]+5];
                    }
                }
            }

            if (alles_passt)
            {
                zeige_loesung(teile, richtung);
            }
        } while (std::next_permutation(teile, teile+7));
    };
};

int main()
{
    Puzzle p;
    PuzzleLeger leger(p);
    leger.lege();
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 26.05.2003 um 10:24 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.05.2003, 10:21 Uhr
virtual
Sexiest Bit alive
(Operator)


Ausgabe:

Code:
Lösung 1
Sechseck in der Mitte (3): (grün, blau, rot, gelb, weiss, schwarz)
Sechseck ganz oben    (0): (grün, blau, schwarz, gelb, weiss, rot)
Sechseck rechts oben  (4): (blau, rot, grün, weiss, schwarz, gelb)
Sechseck rechts unten (5): (rot, gelb, grün, blau, weiss, schwarz)
Sechseck unten        (2): (gelb, schwarz, weiss, rot, grün, blau)
Sechseck links unten  (1): (weiss, blau, schwarz, rot, grün, gelb)
Sechseck links oben   (6): (schwarz, gelb, weiss, rot, grün, blau)
Lösung 2
Sechseck in der Mitte (3): (grün, blau, rot, gelb, weiss, schwarz)
Sechseck ganz oben    (6): (grün, blau, schwarz, gelb, weiss, rot)
Sechseck rechts oben  (4): (blau, rot, grün, weiss, schwarz, gelb)
Sechseck rechts unten (5): (rot, gelb, grün, blau, weiss, schwarz)
Sechseck unten        (2): (gelb, schwarz, weiss, rot, grün, blau)
Sechseck links unten  (1): (weiss, blau, schwarz, rot, grün, gelb)
Sechseck links oben   (0): (schwarz, gelb, weiss, rot, grün, blau)


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.05.2003, 15:34 Uhr
~christian
Gast


Hi!

Ja, mein Programm liefert das gleiche Ergebniss. Ich poste es mal heute Abend. Allerdings ist meine Main Routine nicht so cool wie deine:

Puzzle p;
PuzzleLeger leger(p);
leger.lege();

echt nett!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: