Torres de Hanoi
Publicado por Enzo de Brito Ferber 30/05/2008
[ Hits: 21.382 ]
Homepage: http://www.maximasonorizacao.com.br
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 ;)
/*
* 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;
}
Sintetizador sonoro que toca redez vouz 4
Regra de Horner para cálculo do polinômio
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Secure boot, artigo interessante, nada técnico. (2)
Preciso recuperar videos *.mp4 corrompidos (5)
\Boot sem espaço em disco (Fedora KDE Plasma 42) (7)









