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);
}
}
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Máquinas Virtuais com IP estático acessando Internet no Virtualbox
Instalar o Microsoft Edge no Slackware 15
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
Formatando cartão de memoria que nao formata[AJUDA] (18)
Primeira vez utilizando Linux Ubuntu 22.04 e já tenho problemas… (5)
warsaw parou de funcionar após atualização do sistema (solução) (1)
Separar trafego da VPN da VPS (0)
Desde que seja DDR3, posso colocar qualquer memória? [RESOLVIDO] (6)