[Ybt] [Ejemplo 2 de clase de recurrencia de cálculo básico] Strange Tower of Hanoi

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 )=2d ( 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 { 2F( j )+re( n-j ) }01n
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;
	}
}

Supongo que te gusta

Origin blog.csdn.net/SSL_guyixin/article/details/111633596
Recomendado
Clasificación