Ya lo solucioné, me equivoqué en el movimiento de O a A. Puse A[i]=1 en vez de A[j]=1. De todas formas lo he vuelto a tratar de la siguiente manera la función.
Código C:
Ver originalint moverDisco(int discos,int O[VALOR],int A[VALOR],int D[VALOR],char o, char d) {
int i,j,salida1=0,salida2=0;
i=VALOR;
j=-1;
if (o=='o'){
if (d=='a'){ // Torre origen O, torre destino A
while (salida1==0) {
i--;
if (O[i]!=0)
salida1=1;
if (i==0)
salida1=1;
}
while (salida2==0) {
j++;
if (A[j]==0)
salida2=1;
if (j==VALOR-1)
salida2=1;
}
A[j]=O[i];
O[i]=0;
}
if (d=='d'){ // Torre origen O, torre destino D
while (salida1==0) {
i--;
if (O[i]!=0)
salida1=1;
if (i==0)
salida1=1;
}
while (salida2==0) {
j++;
if (D[j]==0)
salida2=1;
if (j==VALOR-1)
salida2=1;
}
D[j]=O[i];
O[i]=0;
}
}
if (o=='a'){
if (d=='o'){ // Torre origen A, torre destino O
while (salida1==0) {
i--;
if (A[i]!=0)
salida1=1;
if (i==0)
salida1=1;
}
while (salida2==0) {
j++;
if (O[j]==0)
salida2=1;
if (j==VALOR-1)
salida2=1;
}
O[j]=A[i];
A[i]=0;
}
if (d=='d'){ // Torre origen A, torre destino D
while (salida1==0) {
i--;
if (A[i]!=0)
salida1=1;
if (i==0)
salida1=1;
}
while (salida2==0) {
j++;
if (D[j]==0)
salida2=1;
if (j==VALOR-1)
salida2=1;
}
D[j]=A[i];
A[i]=0;
}
}
if (o=='d'){
if (d=='a'){ // Torre origen D, torre destino A
while (salida1==0) {
i--;
if (D[i]!=0)
salida1=1;
if (i==0)
salida1=1;
}
while (salida2==0) {
j++;
if (A[j]==0)
salida2=1;
if (j==VALOR-1)
salida2=1;
}
A[j]=D[i];
D[i]=0;
}
if (d=='o'){ // Torre origen D, torre destino O
while (salida1==0) {
i--;
if (D[i]!=0)
salida1=1;
if (i==0)
salida1=1;
}
while (salida2==0) {
j++;
if (O[j]==0)
salida2=1;
if (j==VALOR-1)
salida2=1;
}
O[j]=D[i];
D[i]=0;
}
}
imprime(O,A,D);
}