Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 5. Sonntagsrätsel

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 < [ 2 ]
000
11.09.2002, 10:35 Uhr
virtual
Sexiest Bit alive
(Operator)


Weil heut Mittwoch ist, mal ein Kleines Sonntagsrätsel. (Puh, wat für ne Logik)

Jeder von Euch kennt sicherlich "Das-Ist-Das-Haus-Vom-Ni-Ko-Laus". Gesucht ist ein Programm, welches folgende Aussage belegt oder widerlegt:
Es gibt nur eine Möglichkeit Das-Haus-Vom-Ni-Ko-Laus zu zeichnen
--
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
001
11.09.2002, 11:39 Uhr
Christian
C/C++ Master
(Operator)


Hi!

Also, wenn du das Haus mit dem Kreuz in der Mitte meinst, da kenn ich aber bereits 2 Möglichkeiten.

Grüße
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.09.2002, 11:49 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, ich meine das Haus mit dem Kreuz in der Mitte.
Okay, dann lass es mich so formulieren:
Entwickel ein Programm, welches die Anzahl der Möglichkeiten berechnet, das Haus nach den Einschlägigen Das-Ist-Das-Haus-Des-Ni-Ko-Laus Regeln (im wesentlichen: stift nicht absetzen) zu zeichnen.
--
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
003
11.09.2002, 15:40 Uhr
Xoc




Zitat:
virtual postete
Weil heut Mittwoch ist, mal ein Kleines Sonntagsrätsel. (Puh, wat für ne Logik)

Jeder von Euch kennt sicherlich "Das-Ist-Das-Haus-Vom-Ni-Ko-Laus". Gesucht ist ein Programm, welches folgende Aussage belegt oder widerlegt:
[i]Es gibt nur eine Möglichkeit Das-Haus-Vom-Ni-Ko-Laus zu zeichnen
[/i]


Wenn man am gleichen Punkt anfängt, wie man aufhört zu zeichnen, gibt es immer mindestens die zweite Möglichkeit den Graphen andersrum zu zeichnen.
Sind Anfang und Ende verschieden, so kann man sie als zweite Möglichkeit austauschen. Es ist also allgemein völlig unmöglich, dass es nur eine Möglichkeit gibt.

MfG
Xoc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.09.2002, 15:43 Uhr
virtual
Sexiest Bit alive
(Operator)


Oh Mann, Xoc , du machst mir das Leben richtig schwer
Next try:
Entwickel ein Programm, welches die Anzahl der Möglichkeiten berechnet, das Haus nach den Einschlägigen Das-Ist-Das-Haus-Des-Ni-Ko-Laus Regeln (im wesentlichen: stift nicht absetzen) zu zeichnen. Lösungen, die durch Umkehrungen einer anderen entstehen, sind zu ignorieren.
--
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
005
13.09.2002, 17:43 Uhr
fry_



Hi Ihr *hechel*

Bin fertig damit. Dabei ist mir aufgefallen, dass ein Start entweder nur unten
links oder unten rechts zum Erfolg führt. <- *odermeinProgspinnt*
Von diesen Startpunkten aus sind jeweils 44 Wege möglich.
Start- u. Endpunkt sind jeweils immer die dieselben.

Ich frag' lieber mal nach, ob ich das hier posten soll? Es ist zwar nur
eine Datei aber Ellen lang.
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger

Dieser Post wurde am 13.09.2002 um 18:00 Uhr von fry_ editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.09.2002, 18:40 Uhr
fry_



#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <sstream>

enum {error=100};

int RESULT;

void print(char* s) {
std::cout << s << std::endl;
}

// Klasse Corner
class Corner {
int max_neighbour;
std::string name;
bool enable;
int index;
public:
Corner() : enable(true), index(0) {}
void set_enable(bool b) { enable=b; }
void set_max_neighbour(int m) { max_neighbour=m; }
int get_max_neighbour() const { return max_neighbour; }
bool get_enable() const { return enable; }

int set_disable_neighbour(Corner* c);
void set_name(std::string n) { name=n; }
std::string get_name() const { return name; }

std::map<int, Corner*> neighbour;
std::map<int, bool> neighbour_enable;
};


int Corner::set_disable_neighbour(Corner* c) {
for (int i=1; i<=get_max_neighbour(); ++i) {

if (neighbour[i]==c) {
neighbour_enable[i]=false;
return 0;
}
}
return error;
}

// Klasse House
class House {
public:
Corner cor[5];
void init_corners() {

// Ecke rechts unten
cor[0].neighbour[1]=&cor[4];
cor[0].neighbour[2]=&cor[3];
cor[0].neighbour[3]=&cor[1];
cor[0].neighbour_enable[1]=true;
cor[0].neighbour_enable[2]=true;
cor[0].neighbour_enable[3]=true;
cor[0].set_max_neighbour(3);
cor[0].set_name("Ecke 0");

// Ecke rechts oben
cor[1].neighbour[1]=&cor[0];
cor[1].neighbour[2]=&cor[4];
cor[1].neighbour[3]=&cor[3];
cor[1].neighbour[4]=&cor[2];
cor[1].neighbour_enable[1]=true;
cor[1].neighbour_enable[2]=true;
cor[1].neighbour_enable[3]=true;
cor[1].neighbour_enable[4]=true;
cor[1].set_max_neighbour(4);
cor[1].set_name("Ecke 1");

// Ecke oben
cor[2].neighbour[1]=&cor[3];
cor[2].neighbour[2]=&cor[1];
cor[2].neighbour_enable[1]=true;
cor[2].neighbour_enable[2]=true;
cor[2].set_max_neighbour(2);
cor[2].set_name("Ecke 2");

// Ecke links oben
cor[3].neighbour[1]=&cor[4];
cor[3].neighbour[2]=&cor[2];
cor[3].neighbour[3]=&cor[1];
cor[3].neighbour[4]=&cor[0];
cor[3].neighbour_enable[1]=true;
cor[3].neighbour_enable[2]=true;
cor[3].neighbour_enable[3]=true;
cor[3].neighbour_enable[4]=true;
cor[3].set_max_neighbour(4);
cor[3].set_name("Ecke 3");

// Ecke links unten
cor[4].neighbour[1]=&cor[3];
cor[4].neighbour[2]=&cor[1];
cor[4].neighbour[3]=&cor[0];
cor[4].neighbour_enable[1]=true;
cor[4].neighbour_enable[2]=true;
cor[4].neighbour_enable[3]=true;
cor[4].set_max_neighbour(3);
cor[4].set_name("Ecke 4");
}
int get_corner_index(Corner* c) const {
int index=0;
for (int i=0; i<5; ++i) {
if (c==&cor[i]) {
return index;
}
index++;
}
return 100;
}
House& operator = (const House g) { // nur kopieren
for (int i=0; i<5; ++i)
cor[i]=g.cor[i];

return *this;
}
House& get_update(House& g) {
for (int a=0; a<5; ++a) {
for (int b=1; b<=cor[a].get_max_neighbour(); ++b) {
cor[a].neighbour_enable[b]=g.cor[a].neighbour_enable[b];
}
}
return *this;
}
};

int main_index=0;
std::string the_way[9];

int main() {

int way_count=0;
std::ofstream File;
File.open("Haus.txt");
bool no_way=true;
House g[8], tmp;
for (int i=0; i<8; ++i) g[i].init_corners();
tmp.init_corners();

std::cout << "\nWo moechtest Du beginnen?\n" << std::endl;
std::cout << "(0) Ecke rechts unten" << std::endl;
std::cout << "(1) Ecke rechts oben" << std::endl;
std::cout << "(2) Ecke mitte oben" << std::endl;
std::cout << "(3) Ecke links oben" << std::endl;
std::cout << "(4) Ecke links unten" << std::endl;
std::cout << "\n> ";
int zahl;
std::cin >> zahl;

File << "(0) Ecke rechts unten" << std::endl;
File << "(1) Ecke rechts oben" << std::endl;
File << "(2) Ecke mitte oben" << std::endl;
File << "(3) Ecke links oben" << std::endl;
File << "(4) Ecke links unten" << std::endl;
File << std::endl;

int index_corner=zahl;
Corner* main_cor=&g[0].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 1
for (int a=1; a<=main_cor->get_max_neighbour(); ++a) {
g[0].get_update(tmp);

if (main_cor->neighbour_enable[a]) {
main_cor->neighbour_enable[a]=false;
sub_cor=main_cor->neighbour[a];

the_way[0]=main_cor->get_name();


RESULT = sub_cor->set_disable_neighbour(main_cor);
if (RESULT==error) print("Fehler: 1. Schleife!");
index_corner=g[0].get_corner_index(sub_cor);

Corner* main_cor=&g[1].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 2
for (int b=1; b<=main_cor->get_max_neighbour(); ++b) {
g[1].get_update(g[0]);

if (main_cor->neighbour_enable[b]) {
main_cor->neighbour_enable[b]=false;
sub_cor=main_cor->neighbour[b];

the_way[1]=main_cor->get_name();

RESULT = sub_cor->set_disable_neighbour(main_cor);
if (RESULT==error) print("Fehler: 2. Schleife!");
index_corner=g[1].get_corner_index(sub_cor);

Corner* main_cor=&g[2].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 3
for (int c=1; c<=main_cor->get_max_neighbour(); ++c) {
g[2].get_update(g[1]);

if (main_cor->neighbour_enable[c]) {
main_cor->neighbour_enable[c]=false;
sub_cor=main_cor->neighbour[c];

the_way[2]=main_cor->get_name();

RESULT = sub_cor->set_disable_neighbour(main_cor);
if (RESULT==error) print("Fehler: 3. Schleife!");
index_corner=g[2].get_corner_index(sub_cor);

Corner* main_cor=&g[3].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 4
for (int d=1; d<=main_cor->get_max_neighbour(); ++d) {
g[3].get_update(g[2]);

if (main_cor->neighbour_enable[d]) {
main_cor->neighbour_enable[d]=false;
sub_cor=main_cor->neighbour[d];

the_way[3]=main_cor->get_name();

RESULT = sub_cor->set_disable_neighbour(main_cor);
if (RESULT==error) print("Fehler: 4. Schleife!");
index_corner=g[3].get_corner_index(sub_cor);

Corner* main_cor=&g[4].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 5
for (int e=1; e<=main_cor->get_max_neighbour(); ++e) {
g[4].get_update(g[3]);

if (main_cor->neighbour_enable[e]) {
main_cor->neighbour_enable[e]=false;
sub_cor=main_cor->neighbour[e];

the_way[4]=main_cor->get_name();

RESULT = sub_cor->set_disable_neighbour(main_cor);
if (RESULT==error) print("Fehler: 5. Schleife!");
index_corner=g[4].get_corner_index(sub_cor);

Corner* main_cor=&g[5].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 6
for (int f=1; f<=main_cor->get_max_neighbour(); ++f) {
g[5].get_update(g[4]);

if (main_cor->neighbour_enable[f]) {
main_cor->neighbour_enable[f]=false;
sub_cor=main_cor->neighbour[f];

the_way[5]=main_cor->get_name();

RESULT = sub_cor->set_disable_neighbour(main_cor);
if (RESULT==error) print("Fehler: 6. Schleife!");
index_corner=g[5].get_corner_index(sub_cor);

Corner* main_cor=&g[6].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 7
for (int h=1; h<=main_cor->get_max_neighbour(); ++h) {
g[6].get_update(g[5]);

if (main_cor->neighbour_enable[h]) {
main_cor->neighbour_enable[h]=false;
sub_cor=main_cor->neighbour[h];

the_way[6]=main_cor->get_name();

RESULT = sub_cor->set_disable_neighbour(main_cor);
if (RESULT==error) print("Fehler: 7. Schleife!");
index_corner=g[6].get_corner_index(sub_cor);

Corner* main_cor=&g[7].cor[index_corner];
Corner* sub_cor;

////////////////////////// Schleife 8
for (int j=1; j<=main_cor->get_max_neighbour(); ++j) {
g[7].get_update(g[6]);

if (main_cor->neighbour_enable[j]) {
main_cor->neighbour_enable[j]=false;
sub_cor=main_cor->neighbour[j];

the_way[7]=main_cor->get_name();
the_way[8]=sub_cor->get_name();

way_count++;
File << " > " << the_way[0].c_str() << " > " << the_way[1].c_str() << " > "
<< the_way[2].c_str() << " > " << the_way[3].c_str() << " > "
<< the_way[4].c_str() << " > " << the_way[5].c_str() << " > "
<< the_way[6].c_str() << " > " << the_way[7].c_str() << " > "
<< the_way[8].c_str() << std::endl;
no_way=false;
}}}}}}}}}}}}}}}}

if (no_way) {
std::cout << "Leider ist von diesem Startpunkt kein Weg moeglich!" << std::endl;
std::cout << std::endl;
}
else {
std::cout << "Es sind " << way_count << " verschiedene Wege moeglich." << std::endl;
std::cout << "Die Moeglichkeiten stehen in der Datei 'Haus.txt'," << std::endl;
std::cout << "im selben Verzeichnis." << std::endl;
std::cout << std::endl;
}
return 0;
}
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger

Dieser Post wurde am 13.09.2002 um 18:55 Uhr von fry_ editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.09.2002, 19:12 Uhr
fry_



...hab das geschrumpft. Läuft im Release. Aber jetzt nicht mehr!

Ich komme mit dem Posten noch nicht so zu Recht.
Hab nicht dran gedacht, dass man nicht (eckige Klammer auf + i + eckige Klammer zu) in seinem Programm habe sollte. die sind jetzt weg.
Dann wollte ich editieren, aber plötzlich war mein Text zu lang.

das cpp am anfang u. /cpp (mit Klammern) wollte er dann auch
nicht mehr annehmen.

Sorry, Leute.

Ich poste einfach nochmal *schäm*
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger

Dieser Post wurde am 13.09.2002 um 19:28 Uhr von fry_ editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.09.2002, 19:29 Uhr
fry_




C++:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <sstream>

enum {error=100};

int RESULT;

void print(char* s) {
    std::cout << s << std::endl;
}

// Klasse Corner
class Corner {
    int                max_neighbour;
    std::string        name;
    bool            enable;
    int                index;
public:
    Corner() : enable(true), index(0) {}
    void    set_enable(bool b) { enable=b; }
    void    set_max_neighbour(int m)  { max_neighbour=m; }
    int        get_max_neighbour() const { return max_neighbour; }
    bool    get_enable() const { return enable; }

    int        set_disable_neighbour(Corner* c);
    void    set_name(std::string n) { name=n; }
    std::string    get_name() const { return name; }
    
    std::map<int, Corner*> neighbour;
    std::map<int, bool> neighbour_enable;
};


int Corner::set_disable_neighbour(Corner* c) {
    for (int a=1; a<=get_max_neighbour(); ++a) {

        if (neighbour[a]==c) {
            neighbour_enable[a]=false;
            return 0;
        }
    }
    return error;
}

// Klasse House
class House {
public:
    Corner cor[5];
    void init_corners() {

        // Ecke rechts unten
        cor[0].neighbour[1]=&cor[4];
        cor[0].neighbour[2]=&cor[3];
        cor[0].neighbour[3]=&cor[1];
        cor[0].neighbour_enable[1]=true;
        cor[0].neighbour_enable[2]=true;
        cor[0].neighbour_enable[3]=true;
        cor[0].set_max_neighbour(3);
        cor[0].set_name("Ecke 0");

        // Ecke rechts oben
        cor[1].neighbour[1]=&cor[0];
        cor[1].neighbour[2]=&cor[4];
        cor[1].neighbour[3]=&cor[3];
        cor[1].neighbour[4]=&cor[2];
        cor[1].neighbour_enable[1]=true;
        cor[1].neighbour_enable[2]=true;
        cor[1].neighbour_enable[3]=true;
        cor[1].neighbour_enable[4]=true;
        cor[1].set_max_neighbour(4);
        cor[1].set_name("Ecke 1");

        // Ecke oben
        cor[2].neighbour[1]=&cor[3];
        cor[2].neighbour[2]=&cor[1];
        cor[2].neighbour_enable[1]=true;
        cor[2].neighbour_enable[2]=true;
        cor[2].set_max_neighbour(2);
        cor[2].set_name("Ecke 2");

        // Ecke links oben
        cor[3].neighbour[1]=&cor[4];
        cor[3].neighbour[2]=&cor[2];
        cor[3].neighbour[3]=&cor[1];
        cor[3].neighbour[4]=&cor[0];
        cor[3].neighbour_enable[1]=true;
        cor[3].neighbour_enable[2]=true;
        cor[3].neighbour_enable[3]=true;
        cor[3].neighbour_enable[4]=true;
        cor[3].set_max_neighbour(4);
        cor[3].set_name("Ecke 3");

        // Ecke links unten
        cor[4].neighbour[1]=&cor[3];
        cor[4].neighbour[2]=&cor[1];
        cor[4].neighbour[3]=&cor[0];
        cor[4].neighbour_enable[1]=true;
        cor[4].neighbour_enable[2]=true;
        cor[4].neighbour_enable[3]=true;
        cor[4].set_max_neighbour(3);
        cor[4].set_name("Ecke 4");
    }
    int    get_corner_index(Corner* c) const {
        int index=0;
        for (int a=0; a<5; ++a) {
            if (c==&cor[a]) {
                return index;
            }
            index++;
        }
        return 100;
    }
    House&    operator = (const House g) { // nur kopieren
        for (int a=0; a<5; ++a)
            cor[a]=g.cor[a];

        return *this;
    }
    House& get_update(House& g) {
        for (int a=0; a<5; ++a) {
            for (int c=1; c<=cor[a].get_max_neighbour(); ++c) {
                cor[a].neighbour_enable[c]=g.cor[a].neighbour_enable[c];
            }
        }
        return *this;
    }
};

int                main_index=0;
std::string        the_way[9];

int main() {

    int way_count=0;
    std::ofstream File;
    File.open("Haus.txt");
    bool no_way=true;
    House g[8], tmp;
    for (int a=0; a<8; ++a) g[a].init_corners();
    tmp.init_corners();
    
    std::cout << "\nWo moechtest Du beginnen?\n" << std::endl;
    std::cout << "(0) Ecke rechts unten" << std::endl;
    std::cout << "(1) Ecke rechts oben" << std::endl;
    std::cout << "(2) Ecke mitte oben" << std::endl;
    std::cout << "(3) Ecke links oben" << std::endl;
    std::cout << "(4) Ecke links unten" << std::endl;
    std::cout << "\n> ";
    int zahl;
    std::cin >> zahl;

    File << "(0) Ecke rechts unten" << std::endl;
    File << "(1) Ecke rechts oben" << std::endl;
    File << "(2) Ecke mitte oben" << std::endl;
    File << "(3) Ecke links oben" << std::endl;
    File << "(4) Ecke links unten" << std::endl;
    File << std::endl;

    int index_corner=zahl;
    Corner* main_cor=&g[0].cor[index_corner];
    Corner* sub_cor;
    
////////////////////////// Schleife 1
    for (a=1; a<=main_cor->get_max_neighbour(); ++a) {
        g[0].get_update(tmp);

        if (main_cor->neighbour_enable[a]) {
            main_cor->neighbour_enable[a]=false;
            sub_cor=main_cor->neighbour[a];

            the_way[0]=main_cor->get_name();
            

            RESULT = sub_cor->set_disable_neighbour(main_cor);
            if (RESULT==error) print("Fehler: 1. Schleife!");
            index_corner=g[0].get_corner_index(sub_cor);
            
            Corner* main_cor=&g[1].cor[index_corner];
            Corner* sub_cor;
            
////////////////////////// Schleife 2
        for (int r=1; r<=main_cor->get_max_neighbour(); ++r) {
            g[1].get_update(g[0]);
                
            if (main_cor->neighbour_enable[r]) {
                main_cor->neighbour_enable[r]=false;
                sub_cor=main_cor->neighbour[r];

                the_way[1]=main_cor->get_name();

                RESULT = sub_cor->set_disable_neighbour(main_cor);
                if (RESULT==error) print("Fehler: 2. Schleife!");
                index_corner=g[1].get_corner_index(sub_cor);
                    
                Corner* main_cor=&g[2].cor[index_corner];
                Corner* sub_cor;
                    
////////////////////////// Schleife 3
        for (int c=1; c<=main_cor->get_max_neighbour(); ++c) {
            g[2].get_update(g[1]);
                        
            if (main_cor->neighbour_enable[c]) {
                main_cor->neighbour_enable[c]=false;
                sub_cor=main_cor->neighbour[c];

                the_way[2]=main_cor->get_name();

                RESULT = sub_cor->set_disable_neighbour(main_cor);
                if (RESULT==error) print("Fehler: 3. Schleife!");
                index_corner=g[2].get_corner_index(sub_cor);

                Corner* main_cor=&g[3].cor[index_corner];
                Corner* sub_cor;
                            
////////////////////////// Schleife 4
        for (int d=1; d<=main_cor->get_max_neighbour(); ++d) {
            g[3].get_update(g[2]);
                                
            if (main_cor->neighbour_enable[d]) {
                main_cor->neighbour_enable[d]=false;
                sub_cor=main_cor->neighbour[d];

                the_way[3]=main_cor->get_name();

                RESULT = sub_cor->set_disable_neighbour(main_cor);
                if (RESULT==error) print("Fehler: 4. Schleife!");
                index_corner=g[3].get_corner_index(sub_cor);

                Corner* main_cor=&g[4].cor[index_corner];
                Corner* sub_cor;
                                    
////////////////////////// Schleife 5
        for (int e=1; e<=main_cor->get_max_neighbour(); ++e) {
            g[4].get_update(g[3]);
                                        
            if (main_cor->neighbour_enable[e]) {
                main_cor->neighbour_enable[e]=false;
                sub_cor=main_cor->neighbour[e];

                the_way[4]=main_cor->get_name();

                RESULT = sub_cor->set_disable_neighbour(main_cor);
                if (RESULT==error) print("Fehler: 5. Schleife!");
                index_corner=g[4].get_corner_index(sub_cor);

                Corner* main_cor=&g[5].cor[index_corner];
                Corner* sub_cor;
                                            
////////////////////////// Schleife 6
        for (int f=1; f<=main_cor->get_max_neighbour(); ++f) {
            g[5].get_update(g[4]);
                                                
            if (main_cor->neighbour_enable[f]) {
                main_cor->neighbour_enable[f]=false;
                sub_cor=main_cor->neighbour[f];

                the_way[5]=main_cor->get_name();

                RESULT = sub_cor->set_disable_neighbour(main_cor);
                if (RESULT==error) print("Fehler: 6. Schleife!");
                index_corner=g[5].get_corner_index(sub_cor);

                Corner* main_cor=&g[6].cor[index_corner];
                Corner* sub_cor;

//////////////////////////  Schleife 7
        for (int h=1; h<=main_cor->get_max_neighbour(); ++h) {
            g[6].get_update(g[5]);
                                                        
            if (main_cor->neighbour_enable[h]) {
                main_cor->neighbour_enable[h]=false;
                sub_cor=main_cor->neighbour[h];

                the_way[6]=main_cor->get_name();

                RESULT = sub_cor->set_disable_neighbour(main_cor);
                if (RESULT==error) print("Fehler: 7. Schleife!");
                index_corner=g[6].get_corner_index(sub_cor);

                Corner* main_cor=&g[7].cor[index_corner];
                Corner* sub_cor;
                                                            
////////////////////////// Schleife 8
        for (int j=1; j<=main_cor->get_max_neighbour(); ++j) {                                                        
            g[7].get_update(g[6]);
                                                                
            if (main_cor->neighbour_enable[j]) {
                main_cor->neighbour_enable[j]=false;
                sub_cor=main_cor->neighbour[j];

                the_way[7]=main_cor->get_name();
                the_way[8]=sub_cor->get_name();

                way_count++;
                File << " > " << the_way[0].c_str() << " > " << the_way[1].c_str() << " > "
                << the_way[2].c_str() << " > " << the_way[3].c_str() << " > "
                << the_way[4].c_str() << " > " << the_way[5].c_str() << " > "
                << the_way[6].c_str() << " > " << the_way[7].c_str() << " > "
                << the_way[8].c_str() << std::endl;
                no_way=false;
    }}}}}}}}}}}}}}}}

    if (no_way) {
        std::cout << "Leider ist von diesem Startpunkt kein Weg moeglich!" << std::endl;
        std::cout << std::endl;
    }
    else {
        std::cout << "Es sind " << way_count << " verschiedene Wege moeglich." << std::endl;
        std::cout << "Die Moeglichkeiten stehen in der Datei 'Haus.txt'," << std::endl;
        std::cout << "im selben Verzeichnis." << std::endl;
        std::cout << std::endl;
    }
    return 0;
}

Wie gesagt, läuft im Releas.
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.09.2002, 21:31 Uhr
~NemoEimi
Gast


Hi,

> Von diesen Startpunkten aus sind jeweils 44 Wege möglich.

Mein Java-Programm findet 120 Wege pro Startpunkt. Hier ist es:


C++:
import java.util.*;

public class nikolaus {
public static void main(String[] args) {
  int AnzahlLoesungen = 0;
  for (int i = 0; i < 6; i++) {
   HausProblem haus = new HausProblem(i);
   haus.ShowAllSolutions();
   AnzahlLoesungen = AnzahlLoesungen + haus.AnzahlGefundenerLoesungen;
   }
  System.out.println("Es wurden " + AnzahlLoesungen + " Loesungen gefunden.");
  }
}

abstract class ProblemSolver {

public int AnzahlGefundenerLoesungen = 0;

public abstract void ZugAusfuehren(int n);
public abstract void ZugZurueck();
public abstract void LoesungZeigen();
public abstract boolean EndknotenErreicht();
public abstract int ErzeugeZugliste();
public abstract boolean LoesungGefunden();

public int AnzahlZugmoeglichkeiten() {
  int n = ErzeugeZugliste();
  return(n);
  }

public void ShowAllSolutions() {
  if (LoesungGefunden()) {LoesungZeigen(); AnzahlGefundenerLoesungen++; return;}
  if (EndknotenErreicht()) {return;}
  int n = AnzahlZugmoeglichkeiten();
  for (int i = 0; i < n; i++) {
   ZugAusfuehren(i);
   ShowAllSolutions();
   ZugZurueck();
   }
  return;
  }
}

class HausProblem extends ProblemSolver {
private int Variantentiefe = 0;
private int StiftPosition;
private int StartPosition;
private int[] GegenwaertigUntersuchteVariante = new int[11];
private int[][] ZugListe = new int[5][11];
private char[][] VerbindungsMatrix =
   {
     {0,1,1,1,0,0},
     {1,0,1,0,1,0},
     {1,1,0,1,1,0},
     {1,0,1,0,1,1},
     {0,1,1,1,0,1},
     {0,0,0,1,1,0}
   };

public void ZugAusfuehren(int n) {
  int k = ZugListe[n][Variantentiefe]; Variantentiefe = Variantentiefe + 1;
  VerbindungsMatrix[k][StiftPosition]=0; VerbindungsMatrix[StiftPosition][k]=0;
  StiftPosition = k;
  GegenwaertigUntersuchteVariante[Variantentiefe] = k;
  }

public void ZugZurueck() {
  Variantentiefe = Variantentiefe - 1;
  int k = GegenwaertigUntersuchteVariante[Variantentiefe];
  VerbindungsMatrix[k][StiftPosition]=1; VerbindungsMatrix[StiftPosition][k]=1;
  StiftPosition = k;
  }

public void LoesungZeigen() {
  for (int i = 0; i <= 10; i++)
   System.out.print(GegenwaertigUntersuchteVariante[i]);
  System.out.print("\n");
  }

public boolean EndknotenErreicht() {
  for (int i = 0; i < 6; i++)
   if (VerbindungsMatrix[StiftPosition][i]==1) return(false);
  return(true);
  }

public int ErzeugeZugliste() {
  int AnzahlZuege = 0;
  for (int i = 0; i < 6; i++)
   if (VerbindungsMatrix[StiftPosition][i]==1) {ZugListe[AnzahlZuege][Variantentiefe]=i;AnzahlZuege=AnzahlZuege+1;}
  return(AnzahlZuege);
  }

public boolean LoesungGefunden() {
  for (int i = 0; i < 6; i++)
   for (int j = 0; j < 6; j++)
    if (VerbindungsMatrix[i][j]==1) return(false);
  return(true);
  }

public HausProblem(int n) {
  StiftPosition=n;
  StartPosition=n;
  GegenwaertigUntersuchteVariante[Variantentiefe]=n;
  }

}




Bei der Ausgabe der Wege steht eine Null für den Punkt ganz links unten, eine 1 für den Punkt rechts unten, eine zwei für den Punkt in der Mitte, usw.
Die Tatsache, daß wir verschiedene Lösungszahlen haben hängt vermutlich mit dem Umstand zusammen, daß ich im Mittelpunkt eine Wegänderung erlaube.
Das Programm ist sehr primitiv, insbesondere die Endknotenbestimmung in der HausProblem-Klasse ist auf trivialem Wege verbesserbar.
Wenn ich mal Zeit habe, werde ich vielleicht versuchen, mir zu überlegen, ob man die Anzahl der Wege auch analytisch herausfinden kann .

Grüße,
NemoEimi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: