#include #include /* Hanojski tornjevi s n diskova. Broji poteze i mjeri vrijeme. */ int nmax = 30; long int broj_poteza; double dsecnd (void) { return (double)( clock( ) ) / CLOCKS_PER_SEC; } void prebaci_jednog(int odakle, int kamo) { /* Umjesto pisanja poteza: printf(" %d -> %d\n", odakle, kamo); samo povecavamo globalni brojac poteza. */ ++broj_poteza; return; } void Hanojski_tornjevi(int n, int odakle, int kamo) { if (n <= 1) prebaci_jednog(odakle, kamo); else { Hanojski_tornjevi(n - 1, odakle, 6 - odakle - kamo); prebaci_jednog(odakle, kamo); Hanojski_tornjevi(n - 1, 6 - odakle - kamo, kamo); } return; } int main(void) { int n; double t1, t2, time, c; printf(" n Broj_Poteza(n) Vrijeme C = T(n) / (2^n - 1)\n"); printf(" n 2^n - 1 T(n)\n"); printf(" ===========================================================\n"); for (n = 1; n <= nmax; ++n) { broj_poteza = 0; /* Inicijalizacija brojaca za ovaj n. */ t1 = dsecnd( ); Hanojski_tornjevi(n, 1, 3); t2 = dsecnd( ); time = t2 - t1; if (broj_poteza > 0) c = time / broj_poteza; else c = 0.0; printf(" %2d %10ld %11.6f %15e\n", n, broj_poteza, time, c); } return 0; }