Torre extraña de Hanoi (recursión)

Extraña torre de Hanoi

Descripción del título
Problema de la Torre de Hanoi, con las siguientes condiciones:

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.

Formato de
entrada Sin entrada.

Formato de salida
Para cada número entero 1≤n≤12, genera un número mínimo de movimientos que cumplen la condición, y cada resultado ocupa una línea

Ideas para resolver problemas

Primero, considere el problema de la Torre de Hanoi con 3 torres. Sea a (n) el número óptimo de pasos para n placas y 3 torres. Primero debemos mover n-1 placas al pilar B. El número óptimo de pasos es d (n-1), luego mueva la placa restante en el pilar A al pilar C, el número de pasos es 1, y finalmente mueva las n-1 placas del pilar B al pilar C, el número óptimo de pasos también es Is a (n-1). Entonces hay una recurrencia:
a (n) = 2 ∗ a (n - 1) + 1 a (n) = 2 * a (n-1) +1a n =2a n-1 +1
Volviendo a esta pregunta, denote f (n) el número óptimo de pasos para n placas y 4 torres. Considere mover j placas de la columna A a la columna B. El número óptimo de pasos es f (j), y luego nj Mueva una placa al pilar D. Considerando que ya hay una placa en el pilar B, el número óptimo de pasos en el modo de 3 torres es a (nj). Finalmente, mueva j placas a B, el número óptimo de pasos También f (j). Considere todo j

	for(int i=2;i<=12;i++)
	 a[i]=a[i-1]*2+1;
	for(int i=2;i<=12;i++)
	{
    
    
		f[i]=2147483647;
		for(int j=1;j<=i;j++)
		 f[i]=min(f[i],f[j]*2+a[i-j]);
	}

Código AC

#include<cstdio>
#include<algorithm>
using namespace std;
int a[15],f[15];
int main()
{
    
    
	a[1]=1;
	for(int i=2;i<=12;i++)//初值
	 a[i]=a[i-1]*2+1;
	f[1]=1;
	printf("1\n");
	for(int i=2;i<=12;i++)//递推
	{
    
    
		f[i]=2147483647;
		for(int j=1;j<=i;j++)
		 f[i]=min(f[i],f[j]*2+a[i-j]);
		printf("%d\n",f[i]);
	}
 	return 0;
}

Gracias

Supongo que te gusta

Origin blog.csdn.net/weixin_45524309/article/details/111400205
Recomendado
Clasificación