23/5/2021 Sistema Virtual de Educación [Contenidos]
1.6. Torres de Hanoi
Definición del problema
Se tiene el siguiente juego para simular el problema de las Torres de Hanoi, que consiste en te
tres postes izquierdo, medio y derecho y un grupo de discos de diferente tamaño los cuales
encuentran ubicados de abajo hacia arriba de mayor a menor tamaño en uno de los tres pos
denominado poste origen; seguidamente deben moverse todos los discos a cualquiera de los ot
dos postes denominado destino y el otro queda como auxiliar; los movimientos de los disc
deben ajustarse a las siguientes reglas:
a. Solo puede moverse un disco a la vez.
b. Un disco de mayor tamaño no puede quedar sobrepuesto a otro de menor tamaño.
c. Debe realizarse en la menor cantidad de movimientos.
d. Uno de los postes queda como auxiliar.
Siguiendo la metodología para resolver problemas en la computadora, implementar un progra
en C++ y en Python para ingresar el número de discos y otros dos números que representan
nombre del poste origen y destino (0 Izquierdo; 1 Medio; 2 Derecho) y a continuac
generar y desplegar la secuencia de pasos para resolver el problema. Hacer la prueba
escritorio MoverDiscos(3, 0, 2, 1), es decir, mover tres discos desde el poste izquierdo hacia
poste derecho, teniendo como auxiliar el poste medio, mostrando el estado de la pila. Hacer
proceso repetitivo.
Análisis
Se plantean dos casos: (1) mover un disco desde el poste izquierdo hacia el poste derecho y
mover tres discos desde el poste izquierdo hacia el poste derecho, cuya solución gráfica es:
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 1/9
23/5/2021 Sistema Virtual de Educación [Contenidos]
Esta última gráfica, nos conduce al diseño en seudocódigo.
Diseño en seudocódigo
Procedimiento MoverDiscos(N, Org, Dst, Aux)
Inicia MoverDiscos
Si N = 1 Entonces
PasarDisco(N, Org, Dst);
Caso_Contrario
Inicia MayorQue1
MoverDiscos(N - 1, Org, Aux, Dst);
PasarDisco(N, Org, Dst);
MoverDiscos(N - 1, Aux, Dst, Org);
Fin Proceso MayorQue1
Fin Procedimiento MoverDiscos;
Prueba de escritorio
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 2/9
23/5/2021 Sistema Virtual de Educación [Contenidos]
Programa en C++
// TorresHanoi
#include <iostream>
using namespace std;
// Prototipado:
void MoverDiscos(int, int, int, int);
void PasarDisco(int, int, int);
void EscribirPoste(int);
// Definicion de funciones:
int main()
int n, origen, destino;
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 3/9
while (1) {
23/5/2021 Sistema Virtual de Educación [Contenidos]
cin >> n;
if (n < 1 || n > 10) break;
cout << "Ingresar el poste origen:\n";
cout << "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): ";
cin >> origen;
if (origen < 0 || origen > 2) break;
cout << "Ingresar el poste destino:\n";
cout << "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): ";
cin >> destino;
if (destino < 0 || destino > 2 || origen == destino) break;
cout << "Secuencia de pasos para mover " << n << " discos desde el
poste ";
EscribirPoste(origen);
cout <<" hacia el poste ";
EscribirPoste(destino);
cout << endl;
MoverDiscos(n, origen, destino, 3 - origen - destino);
cout << endl;
return 0;
void MoverDiscos(int nm, int org, int dst, int aux) {
if (nm == 1)
PasarDisco(nm, org, dst);
else {
MoverDiscos(nm - 1, org, aux, dst);
PasarDisco(nm, org, dst);
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 4/9
23/5/2021 Sistema Virtual de Educación [Contenidos]
void PasarDisco(int n, int org, int dst) {
cout << "Pasar el disco " << n << " desde el poste ";
EscribirPoste(org);
cout << " hacia el poste ";
EscribirPoste(dst);
cout << endl;
void EscribirPoste(int p) {
switch (p) {
case 0: cout << "izquierdo"; break;
case 1: cout << "medio"; break;
case 2: cout << "derecho"; break;
Resultados de la corrida
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 5/9
23/5/2021 Sistema Virtual de Educación [Contenidos]
Programa en C++
# TorresHanoi.py
def NomPoste(argument):
Poste = {
0: "Izquierdo",
1: "Medio",
2: "Derecho"
return Poste.get(argument, "N/A")
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 6/9
def PasarDisco(n, org, dst):
23/5/2021 Sistema Virtual de Educación [Contenidos]
def MoverDiscos(nm, org, dst, aux):
if (nm == 1):
PasarDisco(nm, org, dst)
else :
MoverDiscos(nm - 1, org, aux, dst)
PasarDisco(nm, org, dst)
MoverDiscos(nm - 1, aux, dst, org)
# Funcion Principal:
while (1):
n = int(input( "Ingresar el numero de discos (salir < 1 o > 10): "))
if (n < 1 or n > 10):
break
print("Ingresar el poste origen:")
origen = int(input( "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): "))
if (origen < 0 or origen > 2):
break
print("Ingresar el poste destino:")
destino = int(input( "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): "))
if (destino < 0 or destino > 2 or origen == destino):
break
print( "Secuencia de pasos para mover " + str( n) + " discos desde el poste " +
NomPoste(origen) + " hacia el poste " + NomPoste(destino))
MoverDiscos(n, origen, destino, 3 - origen - destino)
print("")
Resultados de la corrida
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos
7/9
23/5/2021 Sistema Virtual de Educación [Contenidos]
===== RESTART: C:/FunProg/May_Sep2020/NRC6492/II Parcial/TorresHanoi1.py =====
Ingresar el numero de discos (salir < 1 o > 10): 3
Ingresar el poste origen:
0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro valor): 0
Ingresar el poste destino:
0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro valor): 2
Secuencia de pasos para mover 3 discos desde el poste Izquierdo hacia el poste Derecho
Pasar el disco 1 desde el poste Izquierdo hacia el poste Derecho
Pasar el disco 2 desde el poste Izquierdo hacia el poste Medio
Pasar el disco 1 desde el poste Derecho hacia el poste Medio
Pasar el disco 3 desde el poste Izquierdo hacia el poste Derecho
Pasar el disco 1 desde el poste Medio hacia el poste Izquierdo
Pasar el disco 2 desde el poste Medio hacia el poste Derecho
Pasar el disco 1 desde el poste Izquierdo hacia el poste Derecho
Ingresar el numero de discos (salir < 1 o > 10): 4
Ingresar el poste origen:
0 --> Izquierdo, 1 --> Medio, 2 --> Derecho (salir --> otro valor): 2
Ingresar el poste destino:
0 --> Izquierdo, 1 --> Medio, 2 --> Derecho (salir --> otro valor): 1
Secuencia de pasos para mover 4 discos desde el poste Derecho hacia el poste Medio
Pasar el disco 1 desde el poste Derecho hacia el poste Izquierdo
Pasar el disco 2 desde el poste Derecho hacia el poste Medio
Pasar el disco 1 desde el poste Izquierdo hacia el poste Medio
Pasar el disco 3 desde el poste Derecho hacia el poste Izquierdo
Pasar el disco 1 desde el poste Medio hacia el poste Derecho
Pasar el disco 2 desde el poste Medio hacia el poste Izquierdo
Pasar el disco 1 desde el poste Derecho hacia el poste Izquierdo
Pasar el disco 4 desde el poste Derecho hacia el poste Medio
Pasar el disco 1 desde el poste Izquierdo hacia el poste Medio
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 8/9
23/5/2021 Sistema Virtual de Educación [Contenidos]
Pasar el disco 3 desde el poste Izquierdo hacia el poste Medio
Pasar el disco 1 desde el poste Derecho hacia el poste Izquierdo
Pasar el disco 2 desde el poste Derecho hacia el poste Medio
Pasar el disco 1 desde el poste Izquierdo hacia el poste Medio
Ingresar el numero de discos (salir < 1 o > 10): 12
>>>
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir ig
4.0
https://evirtual.espe.edu.ec/programas_scorm.cgi?id_curso=19088&id_unidad=210584&id_pkg=47845&wAccion=ver_scos 9/9