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 )=2∗a (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;
}