Torres de Hanoi
Publicado por Enzo de Brito Ferber 30/05/2008
[ Hits: 21.178 ]
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; }
CalDOS - 60 funções em uma calculadora
HaiDownlodManager - simples programa para baixar arquivos
Contagem de elementos de um array
Angelinux Scripts - Palpite para Megasena em C
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)