Torres de Hanoi

Publicado por Enzo de Brito Ferber 30/05/2008

[ Hits: 21.155 ]

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

Calculadora

Rotinas para manipulação de matrizes

Mini-editor de texto intuitivo em ncurses

Grafos

Countup


  

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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts