Neste tutorial de C++, vamos te mostrar como resolver o clássico problema da Torre de Hanoi, que sempre explicam por aí usando funções recursivas.
Algoritmo da Torre de Hanoi
Muitas das respostas fornecem uma solução direta que converte um algoritmo recursivo em um usando uma pilha.
Porém, existem algoritmos disponíveis que são livres de pilha e podem resolver o problema a partir do estado inicial ou de um estado intermediário.
No livro “The Tower of Hanoi — Myths and Maths” de Andreas Hinz , no capítulo 2, os autores introduzem o “Algoritmo 3: algoritmo Idle Peg” que opera com base na seguinte ideia:
- Introduza um dedal começando no pino da fonte. A cada volta, pegue o dedal com a mão esquerda e mova-o pelos pinos em ordem, formando um ciclo.
- Em seguida, com a mão direita, faça o único movimento legal evitando a cavilha que está bloqueada pelo dedal.
- Parameter n: number of disks
- Parameter i: source peg
- Parameter j: goal peg
- idle <- i
- dir <- (-1)^n (j-i)
- while not all discs are on peg j:
- idle <- (idle + dir) mod 3
- make legal move between pegs different from idle
- end while
Código C++ da Torre de Hanoi
- void tower_of_hanoi( int n ) {
- int idle = 0;
- std::stack<int> pegs[3];
- // Disco numérico de 1 a n, n é o maior
- for (int i = 0; i < n; i++ ) {
- pegs[0].push( n - i );
- }
- while ( pegs[1].size() < n ) {
- idle = (idle + 1) % 3;
- int from, to;
- switch (idle) {
- case 0: from = 1; to = 2; break;
- case 1: from = 0; to = 2; break;
- case 2: from = 0; to = 1; break;
- }
- // Deve mover o disco menor para o disco maior
- if ( pegs[from].empty() ||
- (!pegs[to].empty() && pegs[from].top() > pegs[to].top()) ) {
- std::swap( from, to );
- }
- int disc = pegs[from].top();
- std::cout << "Mover disco " << disc << " de " << from << " para " << to << "\n";
- pegs[from].pop();
- pegs[to].push( disc );
- }
- }
- Parameter n: number of disks
- Parameter s[1..n]: regular state, given as an array
- Parameter j: goal peg
- mu <- 0 // length of path
- delta <- n+1 // active disc
- k <- j // "state of the P1-automaton",
- for d = n down to 1
- if s[d] <> k then
- mu <- mu + 2^(d-1)
- delta <- d
- k <- 3 - k - s[d]
- end if
- end for
Nenhum comentário:
Postar um comentário