Enviado em 05/09/2016 - 12:34h
Boa tarde, apareceu um trabalhinho na facul pra montar um código que resolva o jogo torre de hanói mostrando os passos e com a mínima quantidade de movimentos possíveis. Após uma pesquisa eu vi que é possível fazer com recursividade, porém, não entrei nesse tema ainda, então quis fazer de uma outra forma. Consegui fazer da forma abaixo, onde há uma lógica caso número de discos seja par ou ímpar, aceitos sugestões para otimizar o código caso possível e críticas construtivas, obrigado.
#include<stdio.h>
#include<math.h>
int main()
{
int n, m, d;
//recebe a quantidade de discos
printf("Digite a quantidade de discos\n");
scanf("%d",&d);
// n é a quantidade de movimentos mínimos necessários
n=pow(2,d)-1;
//inprime a quantidade de movimentos
printf("Para essa quantidade de discos sao necessários %d movimentos.\n\n", n);
printf("\n\nMOVIMENTO PERMITIDO: Um disco maior nao pode ficar em cima de um menor\n\n\nPressione enter para prosseguis com os passos\n");
system("pause>>NULL");
//contador de passos
m=1;
//verifica se quantidade de discos é par
if((d % 2) == 0)
{
//quando número de discos for par: repita até a quantidade de movimentos (m) for igual que a quantidade de movimento mínimos necessários(n)
do{
if (m<=n)printf("%d: Se possível movimente o disco da torre A para B, senao, de B para A\n",m);
m=m+1;
system("pause>>NULL");
if (m<=n)printf("%d: Se possível movimente o disco da torre A para C, senao, de C para A\n",m);
m=m+1;
system("pause>>NULL");
if (m<=n)printf("%d: Se possível movimente o disco da torre B para C, senao, de C para B\n",m);
m=m+1;
system("pause>>NULL");
}while (m<=n);
}
else
{
//quando número de discos for ímpar: repita até a quantidade de movimentos (m) for igual que a quantidade de movimento mínimos necessários(n)
do{
if (m<=n)printf("%d: Se possível movimente o disco da torre A para C, senao, de C para A\n",m);
m=m+1;
system("pause>>NULL");
if (m<=n)printf("%d: Se possível movimente o disco da torre A para B, senao, de B para A\n",m);
m=m+1;
system("pause>>NULL");
if (m<=n)printf("%d: Se possível movimente o disco da torre C para B, senao, de B para C\n",m);
m=m+1;
system("pause>>NULL");
}while(m<=n);
}
}
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Criar perfil temporário no Active Directory samba4-21 (2)
Meu Kubuntu não inicia, além do modo de recuperação (no meu dualboot (1)
Site da gontijo simplesmente não abre, ERR_HTTP2_PRO... (3)