ErrorDeSintaxis

Pequeños fragmentos de código fuente en distintos lenguajes de programación, agrupados por categorías.

Puedes buscar entre los fuentes existentes, o aportar los tuyos.

C: Torres de Hanoi

Resuelve el problema de las torres de Hanoi de forma recursiva, en C

Lenguaje: C (compilador: GCC 3)

Categoría: Minijuegos

/* Fuente procedente de ErrorDeSintaxis.es */
/* Resuelve el problema de las torres de Hanoi */
/*  de forma recursiva, en C */
/* Compilador: GCC 3 */
/* Nivel: Básico */
/* Disponible desde 31/08/2011 */
/* Aportado por Nacho */
/* Autor original: Paul Griffiths */
/* Web original: http://www.paulgriffiths.net/program/c/srcs/hanoisrc.html */

/*
 
  HANOI.C
  =======
  (c) Paul Griffiths 1999
  Email: mail@paulgriffiths.net
 
  Outputs moves necessary to complete the
  "Towers of Hanoi" puzzle using a recursive function.
 
  Versión traducida al español y simplificada para ErrorDeSintaxis.es
 
*/
 
 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
 
/*  Declaraciones de funciones  */
 
void Hanoi       (int columnaInic, int columnaFin, int numeroDiscos);
 
/*  Cuerpo del programa: funcion main()  */
 
int main(int argc, char *argv[]) {
    int columnaInic, columnaFin, numeroDiscos;
 
 
    /*  Valores de las variables  */
    printf("Cantidad de discos (p.ej. 4) ?");
    scanf("%d", &numeroDiscos);
    printf("Columna inicial (p.ej. 1) ?");
    scanf("%d", &columnaInic);
    printf("Columna final (p.ej. 3) ?");
    scanf("%d", &columnaFin);
 
    /*  Calcular y mostrar los movimientos necesarios  */
 
    printf("\nTorres de Hanoi!\n");
    printf("================\n");
 
    printf("Se van a mover %d discos de las columna %d a la columna %d...\n",
       numeroDiscos, columnaInic, columnaFin);
    Hanoi(columnaInic, columnaFin, numeroDiscos);
 
    exit(EXIT_SUCCESS);
}
 
 
/*  Calcula y muestra los movimientos necesarios para resolver el puzzle */
 
void Hanoi(int columnaInic, int columnaFin, int numeroDiscos) {
    if ( numeroDiscos ) {
		Hanoi(columnaInic, 6 - (columnaInic + columnaFin), numeroDiscos - 1);
		printf("Moviendo disco de la columna %d a la columna %d\n", columnaInic, columnaFin);
		Hanoi(6 - (columnaInic + columnaFin), columnaFin, numeroDiscos - 1);
    }
}
 

 
Resultado:

Cantidad de discos (p.ej. 4) ?4
Columna inicial (p.ej. 1) ?1
Columna final (p.ej. 3) ?3

Torres de Hanoi!
================

Se van a mover 4 discos de las columna 1 a la columna 3...

Moviendo disco de la columna 1 a la columna 2
Moviendo disco de la columna 1 a la columna 3
Moviendo disco de la columna 2 a la columna 3
Moviendo disco de la columna 1 a la columna 2
Moviendo disco de la columna 3 a la columna 1
Moviendo disco de la columna 3 a la columna 2
Moviendo disco de la columna 1 a la columna 2
Moviendo disco de la columna 1 a la columna 3
Moviendo disco de la columna 2 a la columna 3
Moviendo disco de la columna 2 a la columna 1
Moviendo disco de la columna 3 a la columna 1
Moviendo disco de la columna 2 a la columna 3
Moviendo disco de la columna 1 a la columna 2
Moviendo disco de la columna 1 a la columna 3
Moviendo disco de la columna 2 a la columna 3