Dabei darf
| Hinweis: |
Es bietet sich an, eine Funktion BewegeBisScheibe zu schreiben, die sich rekursiv selbst aufruft, um die
über der aktuellen Scheibe liegende Scheibe zu bewegen (jeder rekursive Aufruf kümmert sich wiederum
wieder um die Scheibe darüber). Die aktuelle Scheibe wird dann in dieser Funktion selbst behandelt
(umgesetzt). Das Hauptprogramm würde dann nur noch aus einigen Eingaben und dem Aufruf dieser Funktion mit der Nummer der untersten Scheibe bestehen. |
#include <stdio.h>
int Zug=0;
/*--------------------------------------------------------------------------*/
// Grundwerte für die Variablen "Scheiben" und "NumScheiben" setzen
void TuermeInitialisieren(int *Scheiben, int TopScheiben[3], int NumScheiben)
{
int i;
for (i = 0; i < NumScheiben; i++)
{
Scheiben[i] = NumScheiben - i; // 1. Turm mit Scheiben fuellen
Scheiben[NumScheiben + i] = 0; // 2. Turm auf 0 setzen
Scheiben[(NumScheiben * 2) + i] = 0; // 3. Turm auf 0 setzen
}
// Anzahl der Scheiben für jeden Turm
TopScheiben[0] = NumScheiben;
TopScheiben[1] = 0;
TopScheiben[2] = 0;
}
/*--------------------------------------------------------------------------*/
void EineScheibeVerschieben(int *Scheiben, int TopScheiben[3], int NumScheiben, int VonTurm, int NachTurm)
{
int AktuelleScheibe = Scheiben[(NumScheiben * VonTurm) + TopScheiben[VonTurm] - 1];
Zug++;
printf("Zug: %d Scheibe: %d Von: %d Nach:%d\n", Zug, AktuelleScheibe, VonTurm + 1, NachTurm + 1);
TopScheiben[VonTurm]--;
Scheiben[(NumScheiben * VonTurm) + TopScheiben[VonTurm]] = 0;
Scheiben[(NumScheiben * NachTurm) + TopScheiben[NachTurm]] = AktuelleScheibe;
TopScheiben[NachTurm]++;
}
/*--------------------------------------------------------------------------*/
// Hier kommt die Funktion mit den rekursiven Aufrufen
void ScheibenVerschieben(int *Scheiben, int TopScheiben[3], int NumScheiben, int VonTurm, int NachTurm, int DummyTurm, int AktuelleScheibe)
{
if (AktuelleScheibe == 1)
EineScheibeVerschieben(Scheiben, TopScheiben, NumScheiben, VonTurm, NachTurm); // Scheibe verschieben
else
{
ScheibenVerschieben(Scheiben, TopScheiben, NumScheiben, VonTurm, DummyTurm, NachTurm, AktuelleScheibe - 1); // rekursiver Aufruf mit Aktueller Scheibe - 1
EineScheibeVerschieben(Scheiben, TopScheiben, NumScheiben, VonTurm, NachTurm); // Scheibe verschieben
ScheibenVerschieben(Scheiben, TopScheiben, NumScheiben, DummyTurm, NachTurm, VonTurm, AktuelleScheibe - 1); // rekursiver Aufruf mit Aktueller Scheibe - 1
}
}
/*--------------------------------------------------------------------------*/
int main(void)
{
int *Scheiben;
int TopScheiben[3];
int Anzahl;
printf("Bitte Anzahl der Scheiben eingeben: ");
scanf("%d", &Anzahl);
// testen, ob min. 1 eingegeben wurde
if(Anzahl<1)
{
printf("Es muss mindestens eine Scheibe vorhanden sein!\n");
return(1); // Programm beenden
}
// Speicher reservieren
Scheiben = (int *)malloc((3 * Anzahl) * sizeof(int));
if (!Scheiben)
{
printf("Es konnte nicht genug Speicher reserviert werden!\n");
return(2); // Programm beenden
}
// Grundwerte setzen
TuermeInitialisieren(Scheiben, TopScheiben, Anzahl);
// Scheiben von einem Turm auf einen anderen verschieben
ScheibenVerschieben(Scheiben, TopScheiben, Anzahl, 0, 1, 2, Anzahl);
// Speicher wieder freigeben
free(Scheiben);
return(0); /* Das Hauptprogramm gibt am Ende 0 zurück, da kein Fehler aufgetreten ist. */
}