[Ybtoj High -fficiency Advanced 1.1] [Recursion] A estranha Torre de Hanói

[Ybtoj High -fficiency Advanced 1.1] [Recursion] A estranha Torre de Hanói

tópico

Insira a descrição da imagem aqui


Ideias para resolução de problemas

Considere primeiro que existem apenas 3 torres
. O número ideal de etapas para mover i é m [i].
Se houver um total de n anéis a serem movidos

  • Mova n-1 anéis para a Torre B primeiro, depois m [n-1] etapas são necessárias
  • Em seguida, coloque o enésimo anel na torre C, ele dá 1 passo
  • Finalmente, coloque essas torres n-1 na torre C, o que requer m [n-1] etapas

Disto, a lei das 3 torres é obtida:
m [i] = 2 * m [i-1] +1

Em seguida, considere o problema
. O número ideal de etapas para as 4 torres moverem i é f [i].
Não há como saber o estado dos primeiros n-1 anéis.

  • Você pode primeiro considerar colocar j na Torre B, o que requer etapas f [j]
  • O restante nj é o problema de 3 torres, que requer m [nj] etapas
  • Finalmente, coloque esses j na torre C, o que requer etapas f [j]

Assim, a lei das 4 torres é obtida:
f [i] = min (f [i], 2 * f [j] + d [nj]) (1 <= j <= i)


Código

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long m[20],f[20];
int main()
{
    
    
    memset(f,0x7f,sizeof(f));
	m[1]=f[1]=1;
	for (int i=2;i<=12;i++)
	     m[i]=2*m[i-1]+1;  //预处理3塔 
	for (int i=2;i<=12;i++)  //枚举环数 
        for (int j=1;j<=i;j++)  //枚举先移去B塔的环数 
            f[i]=min(f[i],2*f[j]+m[i-j]);
    for (int i=1;i<=12;i++)
        printf("%lld\n",f[i]);
    return 0;
} 

Acho que você gosta

Origin blog.csdn.net/qq_45621109/article/details/111636168
Recomendado
Clasificación