Torres de Hanoi

Publicado por Enzo de Brito Ferber 30/05/2008

[ Hits: 21.452 ]

Homepage: http://www.maximasonorizacao.com.br

Download jogo_hanoi.c




O programa simula o jogo das Torres de Hanoi.



Regras:

--> Você só pode mover um disco de vez.

--> Discos de valores maiores não podem ficar em cima de discos de valores menores.



Objetivo:

Transportar todos os discos da coluna A para a coluna C.

Boa sorte e bom aprendizado ;)

  



Esconder código-fonte

/*
 * Programa: Jogo Torres de Hanoi
 * Autor   : Enzo Ferber (enzo@veloxmail.com.br)
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define DISCOS 9
#define VAZIO  0
#define VENCE  1
#define OK     1
#define NO     0

char codigo[3] = {'A', 'B', 'C'};
int pos[3][DISCOS];
int discos;

// Prototipos das funcoes

void imprime_torre(void);
void ini_torres(void);
void troca_valores(int , int);
void limpa_entrada(void);
void clear(void);
void interface(void);
void venceu(void);
void checa_termino(void);

int checa_integridade(int , int);

void clear (void)
{
   system("clear");
}

void limpa_entrada (void)
{
   __fpurge(stdin);
}

void checa_termino (void)
{
   register int i;

   for (i = 0; i < discos; i++)
      if(pos[2][i] == VAZIO ) return ;
   venceu();
}

void venceu (void)
{
   clear();
   imprime_torre();

   printf("\n\nVoce conseguiu! Parabens. \n\n");
   exit(0);
}

void interface (void)
{
   int orig, dest;
   
   do {
      clear();
      imprime_torre();

      printf("\n\n>> Movimento (digite na forma \"origem destino\" (1,2,3): "); limpa_entrada();
      scanf("%d %d", &orig, &dest);  
   } while ((orig < 1) || (orig > 3) || (dest < 1) || (dest > 3));
   
   troca_valores(orig-1, dest-1);
   checa_termino();
   interface();
}

int checa_integridade (int orig, int dest)
{
   register int i=0, j=0;

   while (pos[orig][i] == VAZIO)
      i++;

   while ((pos[dest][j] == VAZIO) && (j < discos))
      j++;

   // if ((orig < 0) || (orig > 2)) return NO;
   // if ((dest < 0) || (dest > 2)) return NO;
   if (pos[dest][j] == VAZIO) return OK;
   return  (pos[orig][i] > pos[dest][j]) ? NO : OK;
}


void troca_valores (int orig, int dest)   
{
   register int i=0, j=0;

   if(checa_integridade(orig ,dest) == NO) return ;
   while (pos[orig][i] == VAZIO)
      i++;

   while ((pos[dest][j] == VAZIO) && (j < discos))
      j++;

   j -= 1;

   pos[dest][j] = pos[orig][i];
   pos[orig][i] = VAZIO;

   return ;
}

void ini_torres (void)
{
   register int i, j;

   for (i = 0; i < 3; i++)
      for (j = 0; j < discos; j++)
         pos[i][j] = (!i) ? (j+1): VAZIO;

   return ;
}

void imprime_torre (void)
{
   register int i;

   printf("          A B C\n");
   printf("          -----\n");
   for (i = 0; i < discos; i++)
      printf("%11.1d %d %d\n", pos[0][i], pos[1][i], pos[2][i]);
}

int main (int argc, char **argv)
{
   if (argc < 2)
   {
      printf("Uso: %s <numero_de_discos>\n", argv[0]);
      return 0;
   }

   discos = atoi(argv[1]);
        
   ini_torres();
   interface();

   return 0;
}



Scripts recomendados

Banco em C

util.h

Árvore binária

Agenda eletronica com banco de dados em arquivo texto

CPU e memória em C no GNU/Linux


  

Comentários
[1] Comentário enviado por albertguedes em 31/05/2008 - 17:56h

Quer trazer o fim do mundo mais rápido cara ? Hahahaha

[2] Comentário enviado por EnzoFerber em 31/05/2008 - 22:20h

uahauhauahauh

pq velho?

:D

abraços

[3] Comentário enviado por albertguedes em 31/05/2008 - 22:40h

Não conhece a lenda das torres de Hanoi ?
Nessa lenda, Brahma (o Deus hindu, não a cerveja) construi num templo hindu uma pilha com 64 discos de ouro e dois mastros enormes(ui!), e ordenou que os monges do templo movessem os discos de um mastro pra outro até formar outra pilha de discos de tamanhos crescentes de acordo com as regras do jogo:

deve-se mover um só disco por vez, e não pode ser colocado um disco maior em cima de um menor.

Quando a transferência dos discos fosse completa, o templo cairia e o mundo acabaria.

Agora, não sei porque os monges aceitariam fazer isso dada as consequências, mas tem um porém.
Com apenas 64 discos, se movermos um disco por segundo - e fazendo os calculos matematicos certos - levariamos 18.446.744.073.709.551.615 segundos para terminar a torre, ou seja, levariamos 594 BILHÕES DE ANOS para terminar a bendita torre !!!
Só pra comparar, o nosso universo estima-se ter aproximadamente 'apenas' 12 bilhões de anos de existência.
Logo, acho que esses monges estariam mais do que sossegados, já que nem a humanidade deve existir no final disso.

Coisa de louco não ?

[4] Comentário enviado por Ruy_Go em 03/06/2008 - 18:48h

Louco mesmo foi essa explicaçao, poderia mandar um link contando isso ai?!?!?!


kkkkkk

[5] Comentário enviado por klein.rfk em 05/06/2008 - 23:40h

tem na Wikipédia.....eh pesquisar por Torres de Hanoi e Brahma

[6] Comentário enviado por albertguedes em 06/06/2008 - 20:36h

Leia também o livro do Donald Knuth - "Matematica Concreta"
Lá tem não só a história, bem como o modo de se calcular as soluções das torres, os algoritmos do programa, etc.


Contribuir com comentário