
int pt[3][10];
int ind[3];

void nputc(int nbre, char c)
{
  while (nbre--) printf("%c", c);
}

void disque(int largeur)
{
  nputc(10 - largeur, ' ');
  nputc(largeur, '=');
  printf("|");
  nputc(largeur, '=');
  nputc(10 - largeur, ' ');
  printf("  ");
}

int max(int a, int b)
{
  return (a > b) ? a : b;
}

void dessine()
{
  int id, ip;
  
  for (id = max(ind[0], max(ind[1], ind[2])); id--;) {
    for (ip = 0; ip != 3; ip += 1) {
      disque(pt[ip][id]);
    }
    printf("\n");
  }
  printf("\n");
}

void deplace(int dep, int dest)
{
  pt[dest][ind[dest]++] = pt[dep][--ind[dep]];
  pt[dep][(ind[dep])] = 0;
  dessine();
}

void c_hanoi(int dep, int inter, int dest, int n)
{
  if (n > 1) {
    c_hanoi(dep, dest, inter, n - 1);
  }

  deplace(dep, dest);

  if (n > 1) {
    c_hanoi(inter, dep, dest, n - 1);
  }
}

void hanoi(int n)
{
  int i, *pp = pt[0];
  
  ind[0] = n;
  ind[1] = ind[2] = 0;

  for (i = 0; i != 10; i += 1)
    pt[0][i] = pt[1][i] = pt[2][i] = 0;

  for (i = n; i; i -= 1) *pp++ = i;

  dessine();
  c_hanoi(0, 1, 2, n);
}

{hanoi(4);}
