====== Hanojské věže ====== #include #include using namespace std; const int N = 5; struct Vez { int v; // vyska int p [N+1]; // p[0] nepouzivame, p[1] velikost spodniho disku, ... p[v] velikost horniho disku }; void napln (Vez& X) { X.v = N; X.p [0] = 0; for (int i = 1; i <= N; i++) X.p [i] = N + 1 - i; } void nuluj (Vez& X) { X.v = 0; for (int i = 0; i <= N; i++) X.p[i] = 0; } /* void krok (Vez & X, Vez & Z) { int d = X.p [X.v]; X.v --; Z.v ++; Z.p [Z.v] = d; } */ void krok (Vez & X, Vez & Z) { assert (X.v > 0); int d = X.p [X.v]; X.v --; if (Z.v > 0) { assert (Z.p [Z.v] > d); } assert (Z.v < N); Z.v ++; Z.p [Z.v] = d; } void tisk (); void hraj (Vez & X, Vez & Y, Vez & Z, int k) { if (k > 1) hraj (X, Z, Y, k-1); krok (X, Z); tisk (); if (k > 1) hraj (Y, X, Z, k-1); } Vez A, B, C; void tiskVeze (Vez & X) { for (int i = 1; i <= X.v; i++) cout << X.p [i]; for (int i = X.v + 1; i <= N; i++) cout << ' '; } void tisk () { tiskVeze (A); cout << " : "; tiskVeze (B); cout << " : "; tiskVeze (C); cout << endl; } int main() { napln (A); nuluj (B); nuluj (C); tisk (); hraj (A, B, C, N); /* krok (A, C); tisk (); */ cout << "O.K." << endl; }