#include #include #include extern void registerme ( int ); extern void startpart ( int ); extern void endpart ( int ); extern void makemove ( int , int , int ); extern void showpegs ( ); void ToH3 ( int i, int j, int A, int B, int C ) { if (i > j) return; ToH3(i, j-1, A, C, B); makemove(j,A,B); ToH3(i, j-1, C, B, A); } void ToH4small ( int i, int j, int A, int B, int C, int D ) { if (j < i) return; if (j == i) { makemove(i, A, B); return; } if (j == i+1) { makemove(i, A, C); makemove(i+1, A, B); makemove(i, C, B); return; } if (j == i+2) { makemove(i, A, D); makemove(i+1, A, C); makemove(i+2, A, B); makemove(i+1, C, B); makemove(i, D, B); return; } } void ToH41 ( int i, int j, int A, int B, int C, int D ) { int n, k; n = j - i + 1; if (n <= 3) { ToH4small(i, j, A, B, C, D); return; } k = n/2; ToH41(i, j-k, A, D, B, C); ToH3(j-k+1, j, A, B, C); ToH41(i, j-k, D, B, A, C); } void ToH42 ( int i, int j, int A, int B, int C, int D, int k ) { int n; n = j - i + 1; if (n <= 3) { ToH4small(i, j, A, B, C, D); return; } if (n <= k) { ToH3(i, j, A, B, C); return; } ToH42(i, j-k, A, D, B, C, k); ToH3(j-k+1, j, A, B, C); ToH42(i, j-k, D, B, A, C, k); } void ToH43 ( int i, int j, int A, int B, int C, int D ) { int n, k; n = j - i + 1; if (n <= 3) { ToH4small(i, j, A, B, C, D); return; } k = (int)round(sqrt(2*n)); ToH43(i, j-k, A, D, B, C); ToH3(j-k+1, j, A, B, C); ToH43(i, j-k, D, B, A, C); } int main ( int argc, char *argv[] ) { int n; if (argc > 1) n = atoi(argv[1]); else scanf("%d",&n); printf("n = %d\n", n); registerme(n); startpart(1); ToH41(1,n,0,1,2,3); endpart(1); startpart(2); ToH42(1,n,0,1,2,3,(int)sqrt(n)); endpart(2); startpart(3); ToH43(1,n,0,1,2,3); endpart(3); exit(0); }