Está en la página 1de 9

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

También podría gustarte