Aqui tienes un programa que soluciona el problema recursivamente.
La parte principal del programa (la que soluciona el problema) lo constituye funcion recursiva:
void torres(struct torrehanoi *fuente,struct torrehanoi *destino,struct torrehanoi *auxiliar,int numdiscos){
   if(numdiscos==1)
      moverdisco(fuente,destino);
   else{
      torres(fuente,auxiliar,destino,numdiscos-1);
      moverdisco(fuente,destino);
      torres(auxiliar,destino,fuente,numdiscos-1);
   }
}
La cual realiza los movimientos de discos de la torre 'fuente' a torre 'destino'. El parámetro 'numdiscos' es la cantidad de discos a ser movidos y 'auxiliar' es la tercera torre que interviene en este problema.
Este es el código fuente del programa.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#define MAXDISCOS 50
struct torrehanoi{
   char *nombretorre;
   int discos[MAXDISCOS]; /* discos que forman la torre (discos[0]=disco de la base) */
   int cima; /* indice del disco que esta en la cima de la torre (discos[cima]=disco de la cima) */
};
void moverdisco(struct torrehanoi *fuente,struct torrehanoi *destino){
   int disco=fuente->discos[(fuente->cima)];
   /* imprime en pantalla un mensaje indicando el movimiento a efectuar */
   printf("-> disco %d de la torre %s a la torre %sn",
      disco,fuente->nombretorre,destino->nombretorre);
   /* se efectua el traslado del disco de torre a torre */
   fuente->discos[(fuente->cima)--]=0;
   destino->discos[++(destino->cima)]=disco;
}
void torres(struct torrehanoi *fuente,struct torrehanoi *destino,struct torrehanoi *auxiliar,int numdiscos){
   if(numdiscos==1)
      moverdisco(fuente,destino);
   else{
      torres(fuente,auxiliar,destino,numdiscos-1);
      moverdisco(fuente,destino);
      torres(auxiliar,destino,fuente,numdiscos-1);
   }
}
void inicializartorre(struct torrehanoi *T,char *nombretorre,int numdiscos){
   int i;
   for(i=0;i<MAXDISCOS;i++) T->discos=0;
   for(i=0;i<numdiscos;i++) T->discos=numdiscos-i;
   T->cima=numdiscos-1;
   T->nombretorre=nombretorre;
}
int main(){
   int i;
   struct torrehanoi A,B,C;
   int numdiscos=3;  /* numero de discos a utilizar */
    inicializartorre(&A,"A",numdiscos);
    inicializartorre(&B,"B",0);
    inicializartorre(&C,"C",0);
   printf("nLAS TORRES DE HANOInn");
    printf("A = FuentenC = DestinonB = Auxiliarn");
   printf("Movimientos realizados con %d discos:n",numdiscos);    
   torres(&A,&C,&B,numdiscos);
   /* muestra los discos en la torre C */
    printf("nLos discos en la torre C, desde la base, son:n");
   for(i=0;i<=C.cima;i++){
      printf("%d ",C.discos);
   }
   return 0;
}