Resumen del problema de la Torre de Hanoi (1)

  1. Lo primero que debe saber es que para la Torre de Hanoi con n placas, el número mínimo de movimientos es (2 ^ n-1), y habrá 2n-ésimo estados de potencia diferentes durante el movimiento.
  2. Ejemplo 1:

Descripción del título:
El número mínimo de movimientos para el problema de la Torre de Hanoi con n placas es 2 ^ / n-1, es decir, se generará una segunda serie de potencias durante el movimiento. El número
de series por desalineación ha aumentado. Este tipo de error es una mala colocación de la columna, y no colocará la placa grande en la placa pequeña, es decir,
el tamaño de cada columna de abajo hacia arriba aún mantiene la siguiente relación:
n = m + p + q
a1> a2>…> am
b1> b2>…> bp
c1> c2>…> cq
Calcula el número total de todas las series que se generarán.


Entrada:
contiene varios conjuntos de datos, primero ingrese T, lo que significa que hay T. Cada línea de datos es el número
de placas N <30.
3
1
3
29


Salida:
Para cada grupo de datos, genere el número total de series generadas durante el movimiento.
3
27
68630377364883

  • Pensando: Para un total de n placas, hay 3 estados; saque (n-1) y la placa más grande tendrá 3x2 estados; luego continúe sacando (n-2) y siga el resto Los dos tendrán estados de 3x3x2 ... y así sucesivamente, puede obtener el siguiente código:
#include<iostream>
#include<cmath>
using namespace std;
 
int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		long long sum=3;
		cin>>n;
		for(int i=2;i<=n;i++)
			sum+=pow(3,i-1)*2;
		cout<<sum<<endl; 
	}
    return 0;
}
  1. Ejemplo 2:

Descripción del título:
el número de placas y el número de una de las placas, encuentre el número mínimo de veces que se mueve la placa.


Entrada:
contiene varios conjuntos de datos. Primero ingrese T, lo que significa que hay T conjuntos de datos. Cada línea de datos es el número de placas N (1 <= N <= 60) y el
número de placas k (1 <= k <= N).
2
60 1
3 1


Salida:
576460752303423488
4

  • A través de la enumeración, se puede concluir que bajo n placas, el número mínimo de veces que la placa numerada k debe moverse es 2 ^ (nk). El ejemplo más obvio es el chasis más grande, que tiene una potencia de 2 elevado a 0. Si se usa aquí la recursividad, considerando que son 60 veces, el consumo de tiempo será muy grande, lo cual no es adecuado. el código se muestra a continuación:
#include<iostream>
#include<cmath>
using namespace std;
 
int main()
{
    
    
    int n,t,k;
    long long result;
    cin>>n;
    while(n--)
	{
    
    
        cin>>t>>k;
        result = pow(2,t-k);
        cout<<result<<endl;
    }
    return 0;
}
  1. Ejemplo 3:

Descripción del problema:
ahora cambie el método de juego, no permita que se mueva directamente del lado más a la izquierda (derecho) al lado más a la derecha (izquierda) (cada movimiento debe moverse a la barra del medio o moverse desde el medio), y el mercado no puede colocarse abajo La parte superior del disco. Ahora hay discos N. ¿Cuántos movimientos deberían ser necesarios para mover estos discos desde el extremo izquierdo al extremo derecho?


Entrada:
contiene varios conjuntos de datos, cada vez que ingrese un valor de N (1 <= N = 35).
1
3
12


Salida:
Para cada grupo de datos, envíe el número mínimo de movimientos.
2
26
531440

  • Pensamiento: Escribe algunos conjuntos de datos más. Al observar la ley, podemos encontrar que el número mínimo de movimientos es exactamente 3 ^ n-1, por lo que el código es el siguiente:
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    
    
	int n;
	while(cin>>n)
	{
    
    
		long long sum=1;//这里要用long long,不然会溢出
		while(n--) sum*=3;
		cout<<sum-1<<endl; 
	}
	return 0;	
}
  1. Ejemplo 4:

Descripción del título: No está
permitido moverse directamente desde el extremo izquierdo (derecho) al extremo derecho (izquierdo) (cada movimiento debe moverse a la barra del medio o quitarse del medio), y no se permite colocar el disco grande encima del disco pequeño. ¿Qué pasa si permitimos que el plato más grande esté encima? (Solo se permite colocar el más grande en la parte superior) Por supuesto, el resultado final es que las placas están dispuestas en el extremo derecho de pequeñas a grandes.


Entrada:
la primera línea de datos de entrada es un dato T, lo que significa que hay T grupos de datos.
Cada grupo de datos tiene un número entero positivo n (1 <= n <= 20), lo que significa que hay n placas.
2
1
10


Salida:
para cada conjunto de datos de entrada, el número mínimo de ubicaciones requeridas.
2
19684

  • Al observar los datos, se puede concluir que el número mínimo de veces cumple con la ley de 3 ^ (n-1) +1, y se puede obtener el siguiente código:
#include<iostream>
using namespace std;

int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		cin>>n;
		long long sum=1;
		n--;
		while(n--) sum*=3;
		cout<<sum+1<<endl;
	}
	return 0;	
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45688536/article/details/105275566
Recomendado
Clasificación