Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

j0rg3jun10r

[CÓDIGO] Torre de Hanoi com 5 Discos

Recommended Posts

SOU INICIANTE NA LINGUAGEM C

E DESENVOLVI ESSE PROGRAMA SIMPLES - TORRE DE HANÓI COM 5 DISCOS
OBS: O CÓDIGO ESTÁ DISPONÍVEL PARA TODOS QUE QUISEREM MELHORÁ-LO 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h> // POW(); CALCULAR O VALOR DE MOVIMENTOS EXATOS DA TORRE DE HANOI;
#define POSICOES 5

int torre1[5]= {1,2,3,4,5}, torre2[5]={0,0,0,0,0}, torre3[5] ={0,0,0,0,0}; // ARRAYS;

int cont=0; // VARIAVEL PARA CONTAR O NUMERO DE JOGADAS;

void mostrarTorres(); // PROTOTIPO DA FUNÇÃO PARA MOSTRA O ESTADO ATUAL DA TORRE;

int valorTorre(int torre[5]); // PROTOTIPO DA FUNÇÃO PARA PEGAR O MENOR VALOR;

int destinoTorre(int torre[5]); // PROTOTIPO DA FUNÇÃO PARA PEGAR O MENOR VALOR;

void moverDiscos(int orig, int dest); // PROTOTIPO DA FUNÇÃO PARA MOVER DISCOS;

void mostrarMenu(); // PROTOTIPO DA FUNÇÃO PARA MOSTRAR O MENU;

int verificarFinal(); // PROTOTIPO DA FUNÇÃO QUE VERIFICA SE O JOGADOR FOI CAMPEÃO;

void regras(); // PROTOTIPO DA FUNÇÃO QUE MOSTRA AS REGRAS DO JOGO;

int main(void){
	int op=1;
	while(op!=0){
		printf(" - TORRE DE HANOI \n   2 - JOGAR\n   1 - REGRAS\n   0 - SAIR\n - DIGITE: ");
		scanf("%d", &op);
		switch(op){
			case 2:
					mostrarTorres();
					mostrarMenu();
					break;
			case 1:
					regras();
					break;
			default:
					if(op != 0){
						printf(" - OPÇÃO INVALIDA INFORME NOVAMENTE\n - ");
						system("PAUSE");
						system("CLS");
					}else{
						system("CLS");
						printf("\n\n\t\t\t  ENCERRADO COM SUCESSO.\n");
					}		
					break;
		}
	}
	return 0;
}


int valorTorre(int torre[]){ // FUNÇÃO PARA ULTIMO VALOR DO ARRAY
	int i, a=0;
	for(i=POSICOES-1; i>=0; i--){
		if(torre[i] != 0){
			a = i;
		}
		if(torre[4] == 0){
			a = 0;
		}
	}
	return(a);
}


int destinoTorre(int torre[]){ // FUNÇÃO PARA RETORNA PROXIMO VALOR DE DESTINO
	int i, a=0;
	for(i=0; i<POSICOES; i++){
		if(torre[i] == 0){
			a = i;
		}
	}
	return(a);
}


void moverDiscos(int orig, int dest){ // FUNÇÃO PARA MOVER OS DISCOS
	int aux1, aux2, aux3;
	// REGRAS (O DISCO DE ORIGEM NÃO PODE SER MAIOR QUE O DESTINO) E (VALOR DO DISCO DE DESTINO TEM QUE SER DIFERENTE DE 0);
	// ORIGEM 1 - TORRE 1
	if(orig == 1){
		// DESTINO 2 - TORRE 2	
		if(dest == 2){
			aux1 = torre1[valorTorre(torre1)];
			aux2 = torre2[destinoTorre(torre2)+1] ;
			aux3 = torre2[valorTorre(torre2)];
			if(aux3 < aux1 && aux3 != 0){
				printf("Disco da origem [%d] é maior que o disco de destino [%d]\n", aux1, aux3);
				system("PAUSE");
			}else{
				if(aux1 == 0){
					printf("Sem discos na torre de origem.\n");
					system("PAUSE");				
				}else{
					torre1[valorTorre(torre1)] = 0;
					torre2[destinoTorre(torre2)] = aux1;
					cont++;
				}
			}
		// DESTINO 3 - TORRE 3
		}else{
			aux1 = torre1[valorTorre(torre1)];
			aux2 = torre3[destinoTorre(torre3)+1] ;
			aux3 = torre3[valorTorre(torre3)];
			if(aux3 < aux1 && aux3 != 0){
				printf("Disco da origem [%d] é maior que o disco de destino [%d]\n", aux1, aux3);
				system("PAUSE");
			}else{
				if(aux1 == 0){
					printf("Sem discos na torre de origem.\n");
					system("PAUSE");				
				}else{
					torre1[valorTorre(torre1)] = 0;
					torre3[destinoTorre(torre3)] = aux1;
					cont++;
				}
			}
		}			
	}
	
	// ORIGEM 2 - TORRE 2
	if(orig == 2){
		// DESTINO 1 - TORRE 1
		if(dest == 1){
			aux1 = torre2[valorTorre(torre2)];
			aux2 = torre1[destinoTorre(torre1)+1] ;
			aux3 = torre1[valorTorre(torre1)];
			if(aux3 < aux1 && aux3 != 0){
				printf("Disco da origem [%d] é maior que o disco de destino [%d]\n", aux1, aux3);
				system("PAUSE");
			}else{
				if(aux1 == 0){
					printf("Sem discos na torre de origem.\n");
					system("PAUSE");				
				}else{
					torre2[valorTorre(torre2)] = 0;
					torre1[destinoTorre(torre1)] = aux1;
					cont++;
				}
			}
		// DESTINO 3 - TORRE 3
		}else{
			aux1 = torre2[valorTorre(torre2)];
			aux2 = torre3[destinoTorre(torre3)+1] ;
			aux3 = torre3[valorTorre(torre3)];
			if(aux3 < aux1 && aux3 != 0){
				printf("Disco da origem [%d] é maior que o disco de destino [%d]\n", aux1, aux3);
				system("PAUSE");
			}else{
				if(aux1 == 0){
					printf("Sem discos na torre de origem.\n");
					system("PAUSE");				
				}else{
					torre2[valorTorre(torre2)] = 0;
					torre3[destinoTorre(torre3)] = aux1;
					cont++;					
				}
			}
		}	
	}
	
	// ORIGEM 3 - TORRE 3
	if(orig == 3){
		// DESTINO 1 - TORRE 1
		if(dest == 1){
			aux1 = torre3[valorTorre(torre3)];
			aux2 = torre1[destinoTorre(torre1)+1] ;
			aux3 = torre1[valorTorre(torre1)];
			if(aux3 < aux1 && aux3 != 0){
				printf("Disco da origem [%d] é maior que o disco de destino [%d]\n", aux1, aux3);
				system("PAUSE");
			}else{
				if(aux1 == 0){
					printf("Sem discos na torre de origem.\n");
					system("PAUSE");				
				}else{
					torre3[valorTorre(torre3)] = 0;
					torre1[destinoTorre(torre1)] = aux1;
					cont++;				
				}		
			}
		// DESTINO 2 - TORRE 2
		}else{
			aux1 = torre3[valorTorre(torre3)];
			aux2 = torre2[destinoTorre(torre2)+1] ;
			aux3 = torre2[valorTorre(torre2)];
			if(aux3 < aux1 && aux3 != 0){
				printf("Disco da origem [%d] é maior que o disco de destino [%d]\n", aux1, aux3);
				system("PAUSE");
			}else{
				if(aux1 == 0){
					printf("Sem discos na torre de origem.\n");
					system("PAUSE");				
				}else{
					torre3[valorTorre(torre3)] = 0;
					torre2[destinoTorre(torre2)] = aux1;
					cont++;
				}
			}
		}	
	}	
	mostrarTorres();
}


void mostrarMenu(){
	int orig, dest, test=0, aux;
	do{
		// VERIFICA SE GANHOU!
		if(verificarFinal() == 1){
			aux = pow(2, POSICOES)-1;
			if(cont == aux){
				printf("\nParabéns, você ganhou e sua pontuação foi excelente %d de %d.\n", cont, aux);
			}else if(cont > aux && cont <aux+5){
				printf("\nParabéns, você ganhou mas sua pontuação foi abaixo da média %d de%d.\n", cont, aux);
			}else{
				printf("\nParabéns, você ganhou mas sua pontuação foi ruim: %d de %d.\n", cont, aux);
			}
			system("PAUSE");
			system("CLS");
			printf("\n\n\t\t\t  ENCERRADO COM SUCESSO.\n");
			exit(0); // FINALIZA O PROGRAMA;
		}
		printf("Informe Torre Origem (1 a 3): ");
		scanf("%d", &orig);
		do{
			if(orig < 1 || orig > 3){
				printf(" - Torre de Origem não corresponde, informe corretamente.\nInforme Torre Origem (1 a 3): ");
				scanf("%d", &orig);	
			}
		}while(orig < 1 || orig > 3);
		mostrarTorres();
		printf("Informe Torre Destino (1 a 3): \t");
		scanf("%d", &dest);
		do{
			if(dest < 1 || dest > 3){
				printf(" - Torre de Destino não corresponde, informe corretamente.\nInforme Torre Destino (1 a 3): ");
				scanf("%d", &dest);	
			}
			if(dest == orig){
				printf(" - O destino não pode ser igual a torre de origem.\nInforme Torre Destino (1 a 3): ");
				scanf("%d", &dest);	
			}
			}while(dest < 1 || dest > 3 || dest == orig);
		moverDiscos(orig, dest);
	}while(test != 1);
}


void mostrarTorres(){
	system("CLS");
	printf("\t   TORRE DE HANOI \n");
	for(int i=0;i<POSICOES;i++){
		printf(" \t |%d|    |%d|    |%d| \n", torre1[i], torre2[i], torre3[i]);	
		//printf(" \t%d|%d|   %d|%d|   %d|%d| \n", i, torre1[i], i, torre2[i], i, torre3[i]);// PARA TESTES
	}
	printf("\t Nº de jogadas: ");
	if(cont < 10){
		printf("0%d\n", cont);
	}else{
		printf("%d\n", cont);
	}
}


int verificarFinal(){
	int opt=0;
	if(torre3[0] == 1){
		opt = 1;
	}
	return(opt);
}


void regras(){
	system("CLS");
	printf(" - Torre de Hanói:\n");
	printf("   O objectivo deste jogo consiste em deslocar todos os discos da haste\n");
	printf("   Onde se encontram para uma haste diferente, \n   Respeitando as seguintes regras:\n\n");
	printf("    1 - deslocar um disco de cada vez, o qual deverá\n        ser o do topo de uma das três hastes.\n\n");
	printf("    2 - cada disco nunca poderá ser colocado sobre\n        outro de diâmetro mais pequeno.\n\n ");
	system("pause");
	system("CLS");
}


 

Share this post


Link to post
Share on other sites

  • Similar Content

    • By biza
      Ola
      Estou  a construir um datalogger em código C.Desta forma necessito passar os dados entre ficheiros. O meu problema está na inclusão de algumas variáveis no topo de um arquivo .txt onde os dados são salvos. Variáveis como tempo de data e hora, id do dispositivo e muito mais... Para isso preciso de ajuda, gostaria que os dados estivessem disponíveis para todos os arquivos, até aí é fácil, basta incluir a variável como extern, no arquivos *.h e incluí-lo em todos os outros que você deseja que a variável esteja disponível. mas como posso fazer para ter acesso a ele dentro do array que preciso?
      Exemplo: main.c
      #include "main.h" char dateTimeFormat[24]; void main(void){ dateTimeFormat = "22-02-22 13:23:04"; } main.h
      extern char dateTimeFormat[24];  
      teste.c
       
      #include "main.h" extern char dateTimeFormat[24]; /*Header .txt file initialization*/ volatile char headerFile[] ="\n\n" "# HEALT MONITORING SYSTEM \r\n" "# DEVELOPED: BIZA \r\n" "# VERSION: B \r\n" "# DATATIMECAPTURE:"+dateTimeFormat+ "\r\n" "# SAMPLINGFREQUENCY: 500 \r\n" "# SAMPLECHANNELS: 1 2 3 4 5 6 7 8 \r\n" "# SAMPLINGRESULUTION: 24 \r\n" "# IDDEVICE: HEALTHY \r\n" "# ENDOFHEADER  
      Como posso incluir a variável "dateTimeFormat" dentro do headerFile como descrevi acima?
       
    • By oromotoceu
      #include <stdio.h>
      #include <stdlib.h>
      #define MAXTAM 1000
      int Frente, Tras, Lista[MAXTAM];
      void Lista_Construtor(){
      Frente=0;
      Tras=-1;
      }
      int Lista_Vazia(){
      if(Tras==-1)
      return 1;
      else
      return 0;
      }
      int Lista_Cheia(){
      if(Tras==MAXTAM-1)
      return 1;
      else
      return 0;
      }
      int Lista_Tamanho(){
      return Tras+1;
      }
      int Lista_Inserir_Inicio(int Valor){
      if(Lista_Cheia()){
      return 0;
      }else{
      /*se quero inserir na posição 0,
      vou deslocar todos os elementos para frente*/
      for(int i=Tras+1;i>Frente;i--){
      Lista=Lista[i-1];
      }
      Lista[Frente]=Valor;
      Tras++;
      return 1;
        }
      }
      int Lista_Inserir_Fim(int Valor){
      if(Lista_Cheia()){
      return 0;
      }else{
      Tras++;
      Lista[Tras]=Valor;
      return 1;
        }
      }
      int Lista_Inserir(int Valor, int Posicao){
      if(Lista_Cheia()){
      return 0;
      }else{
      /* Para verificar se a posição
      está no meio da lista */
      if(Posicao>Frente && Posicao<Tras){
      for(int i=Tras+1;i>Posicao;i--){
      Lista=Lista[i-1];
      }
      Lista[Posicao]=Valor;
      Tras++;
      return 1;
      }else{ 
      return 0;
         }
        }
      }
      int Lista_Remover_Inicio(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor =Lista[Frente];
      for(int i=Frente;i<Tras;i++){
      Lista=Lista[i+1];
         }
      Tras--;
        }
      }
      int Lista_Remover_Fim(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Tras];
      Tras--;
      return 1;
        }
      }
      int Lista_Remover(int *Valor, int Posicao){
      if(Lista_Vazia()){
      return 0;
      }else{
      if(Posicao>Frente && Posicao<Tras){
      *Valor=Lista[Posicao];
      for(int i=Posicao;i<Tras;i++){
      Lista=Lista[i+1];
      }
      Tras--;
      return 1;
         }
        }
      }
      int Lista_Get_toda(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Frente];
      return 1;
        }
      }
      int Lista_Get_inicio(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Frente];
      return 1;
        }
      }
      int Lista_Get_Fim(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Tras];
      return 1;
        }
      }
      int Lista_Busca_Valor(int Valor, int *Posicao){
      int i;
      if(Lista_Vazia()){
      return 0;
      }else{
      for(i=Frente;i<Tras;i++){
      if(Lista==Valor){
      break;
        }
      }
      if(i==Tras){
      return 0;
      }else{
      *Posicao=i; 
      return 1;
         }
        }
      }
      int Lista_Busca_Posicao(int *Valor, int Posicao){
      if(Lista_Vazia()){
      return 0;
      }else{
      if(Posicao>Frente && Posicao<Tras){
      *Valor=Lista[Posicao];
      return 1;
      }else{
      return 0;
         }
        }
      }
      int main(){
      int i,Valor,op=0,pos;
      Lista_Construtor();
      while(op!=12){
      printf("*** Menu de opções ***\n");
      printf("1-Inserir início\n");
      printf("2-Inserir fim\n");
      printf("3-Inserir meio\n");
      printf("4-Excluir início\n");
      printf("5-Excluir fim\n");
      printf("6-Excluir meio\n");
      printf("7-Mostrar toda lista\n");
      printf("8-Mostrar primeiro item da lista\n");
      printf("9-Mostrar último item da lista\n");
      printf("10-Mostrar a posição de um item da lista\n");
      printf("11-Mostrar o valor de uma posição\n");
      printf("12-Sair\n");
      printf("Escolha uma opção: ");
      scanf("%d", &op);
      switch(op){
          case 1:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              Lista_Inserir_Inicio(Valor);
              break;
          case 2:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              Lista_Inserir_fim(Valor);
              break;
            case 3:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja inserir: ");
              scanf("%d", &pos);
              Lista_ Inserir_meio(int Valor, pos); 
              break;
            case 4:
              printf("Digite a remoção do início: ");
              scanf("%d", &*Valor);
              Lista_ Excluir_inicio(*Valor); 
              break;
              case 5:
              printf("Digite a remoção do fim: ");
              scanf("%d", &*Valor);
              Lista_ Excluir_fim(*Valor); 
              break;
              case 6:
              printf("Digite a remoção do meio: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja remover: ");
              scanf("%d", &*Posicao);
              Lista_ Excluir_meio(intValor, * pos); 
              break;
               case 7:
              printf("Digite ao a mostrar toda lista: ");
              scanf("%d", &Valor);
              Lista_ mostrar_toda_lista(Valor);
              break;
             case 8:
              printf("Digite ao a mostrar primeiro item da lista: ");
              scanf("%d", &*Valor);
              Lista_ mostrar_primeiro_item_da_lista(*Valor);
              break;
             case 9:
              printf("Digite ao a mostrar último item da lista: ");
              scanf("%d", &*Valor);
              Lista_ mostrar_ultimo_item_da_lista(*Valor);
              break;
              case 10:
              printf("Digite ao a mostrar a posição de um item da lista: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja mostrar na lista: ");
              scanf("%d", &* pos);
              Lista_ mostrar_posicao_de_um_item_da_lista(intValor, *pos);
              break;
              case 11:
              printf("Digite ao a mostrar o valor de uma posição: ");
              scanf("%d", &*Valor
              printf("Digite a posição que deseja mostrar no valor: ");
              scanf("%d", &pos);
              Lista_ mostrar_posicao_de_um_valor_da_lista(int*Valor, pos);
              break;
              case 12:
              default:
              printf("Valor Invalido!\n");
              system("PAUSE");
               }
         }
       return 0;
      }
    • By oromotoceu
      bom dia pode me ajudar nessa questão por favor
      O programa deverá trabalhar dados de um veículo, onde será armazenado, Nome do proprietário, placa do carro, modelo do carro e preço do carro.
      O programa deve ter as seguintes opções:
      Inserir dados (todos os dados sugeridos no enunciado acima).
      Excluir um Carro específico com a busca pela placa.
      Editar dados de um Carro com a busca pela placa.
      Consultar carro por Placa.
      Exibir todos os dados cadastrados.
      Finalizar programa.
      A opção exibir todos os dados, apresenta tudo que já foi cadastrado e está na memória.
       
    • By TK_T
      olá sou iniciante consegui fazer um o código de um exercício só que quando eu peço o valor 12ab ele lê como numérica alguém pode me ajudar? 
      Exercício: Leia uma string e diga se a mesma é numérica (na base decimal) ou não.
      Ex.: "123" -> numérica
      "abc" -> não numérica
      "12ab" -> não numérica
      "12.34" -> numérica 
      #include <stdio.h> int main() { char Numero; printf("Digite Algo: "); scanf("%c", &Numero); if(Numero == '1' || Numero == '2' || Numero == '3' || Numero == '4' || Numero == '5' || Numero == '6' || Numero == '7' || Numero == '8' || Numero== '9' || Numero == '0') printf("\tNumérica...\n"); else printf("\tNão Numérica\n"); return 0; }  
    • By cgm2k7
      Boa noite!
      Bom preciso de uma dica/ajuda em uma problema...
      tenho duas structs, LIST e NO.  lista duplamente encadeada.
      //insiro/crio 100.000 nos.
       
      struct no{ char *nome; char sexo; float nota; float media; int id; struct no *next, *prev; }; struct list{ long int size_list; struct no *begin, *end; }; typedef struct no NO; typedef struct list LIST; for(int y = 0; y < 100000; y++) inserir_inicio(*list); void CreateNo(NO **no) { *no = (NO*)calloc(1,sizeof(NO)); if (*no) { (*no)->nome = "cicero"; (*no)->sexo = 'M'; (*no)->nota = 0.0; (*no)->media = 1; (*no)->id++; (*no)->next = NULL; (*no)->prev = NULL; is_Ok = true; } else { printf("ERRO: Ao alocar memoria em 'void CreateNo(NO **no)'\n"); is_Ok = false; return; } } void inserir_inicio(LIST *list) { NO *no; CreateNo(&no); if (is_Ok) { no->next = list->begin; list->begin = no; list->size_list++; } } // destroy os nos void DestoyList(LIST **list) { if ((*list)->begin == NULL) { free(*list); printf("Lista vazia!\n\n"); } else { NO *p = (*list)->begin, *tmp = NULL; while (p != NULL) { tmp = p; p = p->next; /*tmp->nome = "0"; tmp->sexo = '\0'; tmp->id = 0; tmp->media = 0;*/ free(tmp); } free(p); (*list = NULL); } } o problema é o seguinte:
      quando inicio o aplicativo ele começão com 512kb, quando criando  100.000  na memoria heap, aumenta para mais ou menos uns 7,8mb, bom ate aqui tudo oks
      mas quando delete este nos com o free() esperava eu q retornasse para os mesmo 512kb inicias do aplicativo, mas isso não acontece, ele retorna para 1,3mb.
      minha pergunta é: porque não deleta tudo, já setei zeros e para todos os membros da struct no mas mesmo assim não deleta tudo.
      Se alguém poder meda da uma dica. OBS: não quero código  pronto eu quero apenas dicas se possível bem explicada porque sou meio novato em c kkk.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.