Torre de Hanoi

Título

Se agrega un plato adicional al juego tradicional Tower of Hanoi.
¿Cuántos pasos se necesitan para mover la Torre de Hanoi de n pisos del primer plato al cuarto plato?

Ideas

Revive la clásica Torre de Hanói

Para mover la capa n del disco 1 al disco 3, debe dividirse en tres pasos:
1: Mueva la capa n-1 del No. 1 al No. 2 (la capa n debe moverse al No. 3, para no afectar el movimiento de la capa n Solo se puede mover al No. 2)
2: Mueva la capa n del 1 al No.
3: 3: Mueva la capa n-1 del No. 2 al No. 3

El primer paso se puede subdividir en tres pasos similares

Hasta que el número total de capas movidas actualmente sea 1, solo se requiere un paso, la recursividad.

Entonces, en el juego clásico de Tower of Hanoi, el número mínimo de pasos móviles en la capa n es
d [n] = d [n-1] + 1 + d [n-1]
d [1] = 1

Torre de Hanoi

La clásica Torre de Hanoi tiene tres bandejas. En un movimiento, solo se pueden utilizar dos bandejas para la operación excepto la bandeja de inicio. Por lo tanto
, la respuesta de la clásica Nobetta de n capas se puede entender como:
En el caso de dos vacantes , El número de escalones necesarios para mover una torre de n pisos es d [n].

Luego, en el juego Tower of Hanoi de cuatro juegos, puede haber tres discos libres para operar.
Cuando necesite mover la Torre Hanoi de n capas, puede mover la capa i superior a un disco vacío, dejando dos discos vacíos.
Mueva la capa ni en los dos discos vacíos restantes, que obviamente es d [n-1].
Por lo tanto, el número mínimo de pasos móviles para la capa n es
f [n] = f [i] + d [ni] + f [i]
f [1] = 1

código fuente ac

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int maxn = 15;

int d[maxn];
int f[maxn];

int main(){
    
    
	d[1] = 1;
	for(int i = 2 ; i <= 12 ; i++){
    
    
		d[i] = d[i-1]*2 + 1;
		f[i] = 1000000000;
	}

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

	for(int i = 1 ; i <= 12 ; i++)cout << f[i] << endl;

}

Supongo que te gusta

Origin blog.csdn.net/qq_35068676/article/details/108902485
Recomendado
Clasificación