
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);
}
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como quebrar senha usando john the ripper
[Resolvido] VirtualBox can't enable the AMD-V extension
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Não consigo instalar distro antiga no virtualbox nem direto no hd (22)
Podem me chamar de 1mbecil :) [RESOLVIDO] (29)









