Extraña torre de Hanoi
Enlace de tema: Torre extraña de Hanoi
Tema
Las condiciones de la Torre de Hanoi son las siguientes:
- Hay cuatro torres A, B, C y D.
- Aquí hay un disco, el número de es constante.
- El tamaño de cada disco es diferente.
- Todos los discos se apilan en la torre A al principio, y el tamaño de los discos aumenta gradualmente desde la parte superior de la torre hasta la parte inferior de la torre.
- Necesitamos transferir todos los discos de la Torre A a la Torre D.
- Se puede mover un disco a la vez. Cuando la torre está vacía o el tamaño del disco superior es mayor que el disco movido, el disco se puede mover a la torre.
Averigüe el número mínimo de movimientos necesarios para mover todos los discos de la Torre A a la Torre D
Ideas para resolver problemas
Obviamente, este es un problema de la Torre de Hanoi con cuatro torres .
Primero consideramos el problema de la Torre de Hanoi con tres torres .
Es bien sabido que las tres torres se establecen d (n) d (n)d ( n ) esnnLa solución óptima de n placas,AAA esn - 1 n-1norte-1 plato colocado enBBB , el número óptimo de pasos esd (n - 1) d (n-1)d ( n-1 ) ; luego el1 1restante1 plato aCCC y finalmenteBBN - 1 n-1en Bnorte-1 plato aCCC , el número óptimo de pasos también esd (n - 1) d (n-1)d ( n-1 ) , por lo que hay una recurrenciad (n) = 2 ∗ d (n - 1) + 1 d (n) = 2 * d (n-1) +1d ( n )=2∗d ( n-1 )+1。
Consideremos ahora el problema de la Torre de Hanoi con cuatro torres .
También establecemos f (n) f (n)f ( n ) significannLa solución óptima de la torre de cuatro torres de Hanoi con n discos.
PonemosBBB se considera un tránsito yjjj discos movidos aBBEn B , el número óptimo de pasos esf (j) f (j)f ( j ) .
Entonces quedan - j njnorte-j placas debido aBBYa hay una placa en B , elAArestanteA ,CCC ,DDD constituye unproblemade latorredeHanoicontres torres, y el número óptimo de pasos esd (n - j) d (nj)d ( n-j ) .
FinalmenteBBJjen Bmover j placas aDDEn D , el número óptimo de pasos también esf (j) f (j)f ( j )。
则 递推 式 为 :
f (n) = min {2 ∗ f (j) + d (n - j)} 0 ≤ 1 ≤ n \ begin {array} {l} f (n) = min \ {2 \ ast f \ left (j \ right) + d \ left (nj \ right) \} \\\; \; \; \; \; \; \; \; \; 0 \ leq1 \ leq n \ end {matriz}f ( n )=m i n {
2∗F( j )+re( n-j ) }0≤1≤n
Finalmente enumeramos jjj , tomaminpara la respuesta \ minmin está bien.
código
#include<iostream>
#include<cstdio>
using namespace std;
int d[20];
int f[20];
int main()
{
for(int i=1;i<=12;i++)
d[i]=2*d[i-1]+1;
f[1]=1;
cout<<1<<endl;
for(int i=2;i<=12;i++)
{
f[i]=0x3f3f3f3f;
for(int j=1;j<=i;j++)
f[i]=min(f[i],2*f[j]+d[i-j]);
cout<<f[i]<<endl;
}
}