Hay tres pilares, cada pilar comienzan vacía. Ponemos tres columnas numeradas 1, 2, 3, y ahora, no es el primer pilarnorteUna placa dispuesta en pequeñas a grandes tamaños, nuestro objetivo es transferir secuencialmente estas placas de la primera columna a la tercera raíz. Que se requiere, es decir, en orden uno en la parte superior de cada columna en la placa, de la suma del tamaño de la placa es menor que durante el movimiento. Entonces, ¿cómo podemos avanzar?
Vamos a pensar un pensamiento tal es que definimos una funciónK A N S T ( X , Y, con), De esta función esXlos pilaresyUna placa móvil de acuerdo con el ordendeEl puesto. En el proceso de pensamiento, no se debe tener en cuenta cómo moverse, solo sabemos que queremos mover muy bien. De esta manera, llamar de nuevoK A N S T ( A , N- 1 , B )ahorasiUn pilar a su vez han dobladonorte- 1Una placa, yUNEl más grande de la izquierda de aquél,CNo en uno. Ahora analizamos,UNSólo uno de los más grandes, que puedenUNCualquier plato colocado. Por lo tanto, laUNEl resto de la mayor móvilesCEn, por loCEse es el mayor en el ascendente. ahora,UNEstá vacío,siallínorte- 1A,CEn uno de los más grandes.
Aquí tenemos su atención, al principioUNHay un pilarnorteUna placa,siy pilaresCSin placa en el pilar, y ahoraUNEn ningún caso,siennorte- 1A,CEn uno de los más grandes. porqueCEn uno de los más grandes, lo que puede poner cualquiera de la placa anterior, es equivalente a vaciar. De esta manera, vamos a mover tenemos que resolvernorteUna placa de simplificar el tema se ha vuelto móvilnorte- 1Cuestión de los platos (sólo un lugar diferente), que es el uso de la idea de recursividad.
uno ahora hemos completado la mayor trasladado aCEn la tarea, entonces nuestra misión última de entender, es la más grande de cada movidoCPilar, por lo que la mayor pile, la trama denorteObtenemos un resultado.
Pseudocódigo
S1:利用Kansu(A, N - 1, B)将A上的N - 1个盘子按照顺序移动到B柱子上
S2:利用Move(A, C)将A柱子上剩下的一个最大的盘子移动到C柱子上
S3:利用Kansu(B, N - 2, A)将B上的N - 2个盘子按照顺序移动到B柱子上
......
最后在一个一个Move的过程中,C上就按照从大到小的顺序垒好了N个盘子。
código C ++
#include <cmath>#include <iostream>void Hanoi(constint n, constint A, constint B, constint C)
{
if (n > 0)
{
Hanoi(n - 1, A, C, B);
std::cout << n << " from " << char (64 + t.x) << " to " << char (64 + t.y) << '\n';
Hanoi(n - 1, C, A, B);
}
}
int main(int argc, char ** argv)
{
int n;
std::cin >> n;
std::cout << std::pow(2, n) - 1 << std::endl;
// 2^n - 1 表示步数总数
Hanoi(n, 1, 3, 2);
return0;
}