#include <stdio.h>
#include <string.h>

#define MAXN 50

int move_number=0;
int a[MAXN], b[MAXN], c[MAXN];
int top_a=-1, top_b=-1, top_c=-1;
int verbose=0; /* flag for verbose mode */

int scan_command(int argc, char *argv[], int *n, int *verbose)
{
  while (--argc) {
    if (sscanf(argv[argc],"-n%lu",n)==1) ;
    else if (strcmp(argv[argc],"-v")==0) *verbose=1;
    else {
      printf("Usage: %s [-nN][-v]\n", argv[0]);
      return -1;
    }
  }
  return 0; /* normal exit from ths function */
}

void print_situation()
{
  int i;
  printf("\n\n A: ");
  for (i=0; i<=top_a; i++)
    printf(" %d", a[i]);
  printf("\n B: ");
  for (i=0; i<=top_b; i++)
    printf(" %d", b[i]);
  printf("\n C: ");
  for (i=0; i<=top_c; i++)
    printf(" %d", c[i]);
  printf("\n\n");
}

void set_up_start(int n)
{
  int i;
  for (i=0; i<n; i++)
    a[i]=i;
  top_a=n-1;
}

void solve(int u[], int *top_u, char u_name, 
           int v[], int *top_v, char v_name, 
           int w[], int *top_w, char w_name,
	   int n_disks)
{
  if (n_disks==1) {
    v[++(*top_v)]=u[(*top_u)--];
    printf("Move number %d: disk %d, %c -> %c\n", 
      ++move_number, v[*top_v], u_name, v_name);
    if (verbose) print_situation();
  } else {
    solve(u, top_u, u_name, w, top_w, w_name, v, top_v, v_name, n_disks-1);
    v[++(*top_v)]=u[(*top_u)--];
    printf("Move number %d: disk %d, %c -> %c\n", 
      ++move_number, v[*top_v], u_name, v_name);
    if (verbose) print_situation();
    solve(w, top_w, w_name, v, top_v, v_name, u, top_u, u_name, n_disks-1);
  }
}

main(argc,argv)
  int argc; /* the number of command-line arguments */
  char *argv[]; /* an array of strings containing those arguments */
{
  int n=3; /* number of disks */

  if (scan_command(argc, argv, &n, &verbose)==0) {
    set_up_start(n);
    print_situation();
    solve(a, &top_a, 'A', b, &top_b, 'B', c, &top_c, 'C', n);
    print_situation();
    return 0; /* normal exit */
  }
}
   


