Explorar la Torre de Hanoi problema

Explorar la Torre de Hanoi problema

El título original

Hay tres pilares, cada pilar comienzan vacía. Ponemos tres columnas numeradas 1, 2, 3, y ahora, no es el primer pilar norte Una 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?

Vincular a presentar área de evaluación (codevs)

pensamiento

Vamos a pensar un pensamiento tal es que definimos una función K A N S T ( X , Y, con) , De esta función es X los pilares y Una placa móvil de acuerdo con el orden de El 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 nuevo K A N S T ( A , N- 1 , B ) ahora si Un pilar a su vez han doblado norte- 1 Una placa, y UN El más grande de la izquierda de aquél, C No en uno. Ahora analizamos, UN Sólo uno de los más grandes, que pueden UN Cualquier plato colocado. Por lo tanto, la UN El resto de la mayor móviles C En, por lo C Ese es el mayor en el ascendente. ahora, UN Está vacío, si allí norte- 1 A, C En uno de los más grandes.

Aquí tenemos su atención, al principio UN Hay un pilar norte Una placa, si y pilares C Sin placa en el pilar, y ahora UN En ningún caso, si en norte- 1 A, C En uno de los más grandes. porque C En 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 resolver norte Una placa de simplificar el tema se ha vuelto móvil norte- 1 Cuestió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 a C En la tarea, entonces nuestra misión última de entender, es la más grande de cada movido C Pilar, por lo que la mayor pile, la trama de norte Obtenemos 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(const int n, const int A, const int B, const int 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);
    return 0;
}
Publicado 40 artículos originales · ganado elogios 0 · Vistas 5163

Supongo que te gusta

Origin blog.csdn.net/edward00324258/article/details/71214244
Recomendado
Clasificación