Estranha Torre de Hanói (recursão)

Torre estranha de Hanói

Descrição do título O
problema da Torre de Hanoi, com as seguintes condições:

Existem quatro torres A, B, C e D.
Aqui está um disco, o número de é constante.
O tamanho de cada disco é diferente.
Todos os discos são empilhados na torre A no início, e o tamanho dos discos aumenta gradualmente do topo da torre até a base da torre.
Precisamos transferir todos os discos da Torre A para a Torre D.
Um disco pode ser movido por vez. Quando a torre estiver vazia ou o tamanho do disco superior for maior do que o disco movido, o disco pode ser movido para a torre. Descubra o número mínimo de movimentos necessários para mover todos os discos da Torre A para a Torre D.

Formato de
entrada Sem entrada.

Formato de saída
Para cada número inteiro 1≤n≤12, imprima um número mínimo de movimentos que atendam à condição, e cada resultado ocupa uma linha

Ideias para resolução de problemas

Considere primeiro o problema da Torre de Hanói com 3 torres. Seja a (n) o número ideal de etapas para n placas e 3 torres. Primeiro, precisamos mover n-1 placas para o pilar B. O número ideal de etapas é d (n-1), a seguir mova a placa restante no pilar A para o pilar C, o número de etapas é 1 e, finalmente, mova as placas n-1 no pilar B para o pilar C, o número ideal de etapas também é É a (n-1). Portanto, há uma recorrência:
a (n) = 2 ∗ a (n - 1) + 1 a (n) = 2 * a (n-1) +1a n =2a n-1 +1
De volta a esta questão, deixe f (n) denotar o número ideal de etapas para n placas e 4 torres. Considere mover j placas da coluna A para a coluna B. O número ótimo de etapas é f (j), e então nj Mova uma placa para o pilar D. Considerando que já existe uma placa no pilar B, o número ideal de etapas no modo de 3 torres é a (nj). Finalmente, mova j placas para B, o número ideal de etapas Também f (j). Considere todos os 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;
}

Obrigado

Acho que você gosta

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