Torres extrañas de Hanoi (Torres extrañas de Hanoi)

tema

tema

práctica

Sí, sigue siendo práctica 1 y práctica 2.

Método 1

¡La violencia obra milagros! ! ! !

Descubrimos que este tema son cuatro torres, por lo que usamos el cuaternario para representar el estado de cada placa, que es aproximadamente 2 24 2 ^ {24}22 4 niveles, use la matriz bool no explotará, luego se puede realizar una simulación violenta.

Espera, parece que se requiere el número mínimo de pasos, entonces podemos usar BFS y cambiar bool a int. Es así de simple.

BFS abre una cola, solo use int inti n t medio estado, qué tan grande es el espacio?

64 MB 。。。。。

Sí, este enfoque es incorrecto, el espacio está atascado y no se puede mover, el tiempo es: O (2 24 ∗ 12) O (2 ^ {24} * 12)O ( 22 41 2 ) , también explotará, pero como cada pilar es monótono, será más pequeño que esto en la práctica, pero el espacio ya ha explotado, así que no lo intentaré.

Método 2

Recursión.

Pensemos en ello, ¿y si los tres pilares de la Torre Han Luo lo hacen?

Es fácil saber que para la cantidad de más de dos placas, necesitamos al menos tres pilares para poder mover estas placas. Cuando solo se mueve una placa, solo se necesitan dos pilares, por lo que para kkPara k placas, necesitamos usar tres pilares para establecer primerok - 1 k-1k-Mueva 1 placa al segundo pilar y luego use los dos pilares para mover elkkk platos a3 33 , luegok - 1 k-1k-1 plato usa tres pilares para moverse altercero 33 raíces, suma:f (i) = f (i - 1) ∗ 2 + 1 f (i) = f (i-1) * 2 + 1f ( i )=f ( yo-1 )2+1

Entonces, para los cuatro pilares, para kkk placas, debido a2 22 o más platos necesitan3 33 pilares, así que aunque podemos ponerii deantemanoColoque las placas i en una columna para reducir la presión de movimiento, pero solo se puede colocar en una columna como máximo.

Entonces sale la fórmula de recurrencia: f 4 (n) = f 4 (n - i) + f (i) f_4 (n) = f_4 (ni) + f (i)F4( n )=F4( n-yo )+f ( i )

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define  N  14
using  namespace  std;
int  f3[N],f4[N];
inline  int  mymin(int  x,int  y){
    
    return  x<y?x:y;}
int  main()
{
    
    
	f3[1]=1;for(int  i=2;i<=12;i++)f3[i]=f3[i-1]*2+1,f4[i]=999999999;
	f4[1]=1;
	for(int  i=2;i<=12;i++)
	{
    
    
		for(int  j=0;j<i;j++)
		{
    
    
			f4[i]=mymin(f4[j]*2+f3[i-j],f4[i]);
		}
	}
	for(int  i=1;i<=12;i++)printf("%d\n",f4[i]);
	return  0;
} 

Supongo que te gusta

Origin blog.csdn.net/zhangjianjunab/article/details/107637745
Recomendado
Clasificación