Torre de Hanoi, ¿cómo se escribe y punto?
●Código fuente C++ para la implementación no recursiva del algoritmo de la Torre de Hanoi
#Incluye iostream
Usar namespace std
Número máximo de discos para 64.
const int MAX = 64
Se utiliza para representar la información de cada columna.
Estructura st{
int s[MAX]; almacenamiento en disco en la columna
int parte superior de la pila, utilizada para el disco superior.
Nombre del personaje; el nombre de la columna puede ser uno de A, B y c.
Int Top() obtiene el elemento superior de la pila.
{
return s[top];
}
Int Pop() excedió la pila.
{
return s[top –];
}
Void empujado a la pila (int x)
{
s[++ arriba]= x;
}
};
long Pow(int x, int y); Calcular x y
void Creat(st ta[], int n); Establece el valor inicial de la matriz de estructura.
void Hanoi Tower (st ta[], long max la función principal de Hanoi Mobile Tower
int main(void)
{
int n;
CIN n; Introduzca el número de discos.
ST ta[3];La información de los tres pilares se almacena en la matriz de la estructura.
Creat(ta, n); Establece el valor inicial de la matriz de estructura.
long max = Pow(2,n)-1; el número de movimientos debe ser igual a 2 n-1.
Torre de Hanoi (ta, max); la función principal del sistema de Torre Móvil de Hanoi ("pausa");
}
Creación nula(st ta[], int n)
{
ta[0]. nombre = ' A
ta[0]. top = n-1;
Coloque todos los discos en la columna A en orden de mayor a menor.
for(int I = 0; in; i++)
ta[0]. s[I]= n-I;
No hay discos en los pilares B y c al principio.
ta[1]. arriba = ta[2]. arriba = 0;
for(int I = 0; en; i++)
ta[1]. s[i] = ta[2]. s[I]= 0;
Si n es un número par, coloque una B y una C en el sentido de las agujas del reloj.
Si (n%2 == 0)
{
ta[1]. nombre = ' B
ta[2]. name = ' C
}
De lo contrario, si n es un número impar, coloque A C B en el sentido de las agujas del reloj.
{
ta[1]. nombre = ' C
ta[2].
name = ' B
}
}
Potencia larga (entero x, entero y)
{
Suma larga = 1;
for(int I = 0;iy;i++)
suma = x;
Devuelve la suma;
}
Torre de Hanoi no válida (st ta[], long max)
{
int k = 0 número acumulado de movimientos; p>
int I = 0;
int ch
Blanco (kmax)
{
Cambiar disco 1 de Move la columna actual a la siguiente columna en el sentido de las agujas del reloj.
ch=ta[i%3]. pop();
ta[(i+1)%3]. Push (ch);
cout ++k " "
Mover el disco "ch" de "ta[i%3]. nombre
" a " ta[(i+1)%3]. name endl
i++;
Mueva los discos extraíbles de las otras dos columnas a la nueva columna.
IF(kmax)
{
Mueva el disco de la columna no vacía a la columna vacía. Cuando ambas columnas estén vacías, mueva el disco más pequeño /p>
. if (ta[(i+1)%3].Top() == 0
ta[(i-1)%3].top()0 & amp; & amp
ta[(i+1)%3]. Arriba() ta[(i-1)%3]
{
ch = ta[(i-1). )%3]. pop();
ta[(i+1)%3].
cout ++k " " "Disco móvil"
ch " de " ta[(i-1)%3].nombre
" a " ta[(i+1) %3]. Nombre endl
} p>
Otro
{
ch = ta[(i+1)%3 pop();
ta[(i-]. 1)%3]. Push(ch);
cout ++k "" "Disco móvil"
ch " de " ta[(i+1)%3]. nombre
" a " ta[(i-1)%3].nameendl
} p>
}
}
}