Hanojské věže

#include <iostream>
#include <cassert>
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;
}
 
zalg/veze_ct.txt · Last modified: 2021/04/29 15:13 by 88.103.111.44
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki