Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Suche die Zugfolge

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
18.10.2002, 13:01 Uhr
fry_



Hi Ihr

Bevor der Sonntag anbricht, wollte ich noch ein kleines Rätsel dazwischen schieben.
Gefunden habe ich es im Internet.

Man habe ein Schachbrett(8x8 Felder) u. die Spielfigur Springer.
Gesucht ist nun ein Programm, das eine Zugfolge ermitteln kann, bei der der Springer, nach den Schachregeln über das Brett springt, bis jedes Feld von ihm maximal einmal betreten wurde.
Das Startfeld sollte der Anwender selbst entscheiden können.

Schachregeln: Springer
http://home.t-online.de/home/frankto/springer.htm

Gruß
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.10.2002, 13:54 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
#include <stdio.h>

#define BREITE 8
#define HOEHE 8

typedef int schachbrett_t[BREITE][HOEHE];
typedef char zugfolgestring_t[BREITE*HOEHE*3+1];

schachbrett_t brett;
zugfolgestring_t zugfolge;
int freie_felder = BREITE*HOEHE;

int
teste_position(
    int x,
    int y)
{
    return x>=0 && x<=7 && y>=0 && y<=7;
}

int
zug_eintragen(
    int x,
    int y)
{
    char puffer[4];
    brett[x][y] = 1;
    sprintf(puffer, "%c%c ", x+'A', y+'1');
    strcat(zugfolge, puffer);
    return 0==--freie_felder;
}

void
zug_austragen(
    int x,
    int y)
{
    zugfolge[strlen(zugfolge)-3] = 0;
    freie_felder++;
    brett[x][y] = 0;
}

int
bewege_springer(
    int x,
    int y)
{
    static int offsets[8][2] = {
        {+1, -2},
        {-1, -2},
        {+1, +2},
        {-1, +2},
        {+2, -1},
        {-2, -1},
        {+2, +1},
        {-2, +1}
    };
    int j;
    int xn;
    int yn;

    if (zug_eintragen(x,y))
        return 1;

    for(j=0; j<8; ++j)
    {
        xn = x+offsets[j][0];
        yn = y+offsets[j][1];
        if (teste_position(xn, yn) && !brett[xn][yn])
        {
            if (bewege_springer(xn,yn))
                return 1;
        }
    }
    zug_austragen(x, y);
    return 0;
}

int
main()
{
    int x;
    int y;

    printf("Das Schachbrett ist %dx%d  Felder gross.\n", BREITE, HOEHE);

    srand(time(NULL));
    x = rand()%BREITE;
    y = rand()%HOEHE;
    printf("Anfangsposition ist %c%c\n", 'A'+x, '1'+y);

    if (bewege_springer(x,y))
    {
        printf("Eine moegliche Zugfolge ist:\n%s\n", zugfolge);
    }else
    {
        puts("Es scheinbt keine Loesung zu geben!");
        return 1;
    }
    return 0;
}


Allerdings: es wäre übertrieben, wenn ich sagen würde, dass das Programm bei einem 8x8 Brett schnell wäre. Jedenfalls rechnet es bereits schon seit 10 Minuten... Bei einem 4x4 Brett bekommt man die Lösung nahezu prompt.
--
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
002
18.10.2002, 14:45 Uhr
fry_



Erweiterung: (Für alle C++ Meister u. die es noch werden wollen)
Schreibe ein Programm, welches eine Zugfolge auf einem Schachbrett(8x8 Felder) ermittelt, wie schon oben beschrieben, u. dabei weniger als 10 Minuten Rechenzeit benötigt.
(Auf einem Standard PC)
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.10.2002, 14:54 Uhr
Christian
C/C++ Master
(Operator)


Hi!

At fry:
Was verstehst du unter einem Standard PC?

At virtual:
Im Prinzip ist dein Lösungsprinzip das gleiche wie meine Lösung des Nikolauses.
Dieses Prinzip scheint auf total viele Aufgaben zu passen.

Grüße Christian
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.10.2002, 15:03 Uhr
Tommix



Hallo,
bin leider zu beschäftigt (und zu faul) zum proggen, aber ich kenne eine schnellere Methode:
- Nachbarfelder eines Feldes seien diejenigen, die per Springerzug erreicht werden können, also maximal 8, am Rand entsprechend weniger.
- Freie Nachbarfelder sind die Nachbarfelder, wo der Springer noch nicht war.
- Man ziehe immer auf das freie Nachbarfeld, das selbst wiederum die kleinste Zahl freier Nachbarfelder von allen hat.
Zusatztip: Wenn man das Feld jeweils links, oben, rechts und unten zwei Felder größer macht und diese am Anfang als "schon benutzt" markiert, spart man einige if's.

FF
- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.10.2002, 15:10 Uhr
fry_



At Christian
Na ja, der Rechner sollte nicht schneller sein,
was man jetzt so zB. bei Aldi bekommen würde.
Ich möchte damit die Motivation oben halten.

Gruß
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger

Dieser Post wurde am 18.10.2002 um 15:30 Uhr von fry_ editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.10.2002, 16:04 Uhr
virtual
Sexiest Bit alive
(Operator)


Nur so zur Info: Mein Programm läuft noch immer . Bin mal gespannt, wann es wieder kommt...
--
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
007
18.10.2002, 17:09 Uhr
fry_



Ich weiß noch nicht ob es klappt, aber man kann es doch versuchen, solch einen Tricky Code zu finden.
Siehe Tommix Überlegung.
Zu dem eigentlichen Rätsel ändere ich Feldanzahl von 8x8 auf 4x4(war noch nicht so weit) -> Sorry.

Die Erweiterung möchte ich aber ganz gerne so lassen.

Gruß
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
26.10.2002, 11:47 Uhr
Tobi



Die Aufgabe erinnert mich an die "Bienenwabe"
--
Mit Computern können wir Probleme lösen die wir ohne sie gar nicht erst hätten!

mfg

Tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
26.10.2002, 13:20 Uhr
fry_



Ja -> Du glaubst gar nicht, wie ich mir die Felder schon vorgestellt habe, um den Code für das Zusatzrätsel zu beschleunigen. Das lahmt bei mir aber nur u. ist nicht lösbar.
Hat das eigentlich einer mal versucht?

Gruß
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger
 
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: