Hanoi

1 resposta
Fellipex

Bom galera é o minha dúvida é o seguinte, estou implementando a Torre de Hanoi em C++, e como solicitado é necessário utilizar a maneira iterativa com pilhas encadeadas e não a maneira recursiva(muito famosa), porém mesmo entendendo o conceito do hanoi e o conceito da pilha encadeada, minha dúvida estar em juntar essas duas informações e modelar meu projeto. Gostaria se vocês poderiam me ajudar como poderia ser a estrutura do programa, por exemplo preciso criar as classes como Disco, Pino, InfoDisco?(fiz assim porém estou na dúvida). Não estou pedindo código pronto, o essencial mesmo seria uma luz de como abstrair os dois conceitos e juntar no projeto.
Att

1 Resposta

Fellipex

Bom galera vou postar o que eu ja fiz

#include <Pino.h>
#include <iostream>
#include <string.h>
#include <cstring>

int main() {
	Pino *pinoFonte = new Pino();
	Pino *pinoMeio = new Pino();
	Pino *pinoDestino = new Pino();
	InfoDisco* info = new InfoDisco();
	bool primeiraJogada;
	int qtDisco;
	double diametroDisco;
	std::cout << "Digite quanto discos deseja usar? \n";
	std::cin >> qtDisco;
	for (int i = 0; i < qtDisco; i++) {
		Disco* disco = new Disco();
		std::cout << "Digite o diâmetro do disco \n";
		std::cin >> diametroDisco;
		disco->getInfo()->setDiametroDisco(diametroDisco);
		pinoFonte->empilha(disco->getInfo());
		primeiraJogada = true;
	}
	while (pinoFonte->getTamanho() != 0 && pinoDestino->getTamanho() != qtDisco) {
		if (primeiraJogada) {
			if (qtDisco % 2 != 0) {
				Disco* disco = new Disco();
				disco->setInfo(pinoFonte->desempilha());
				disco->setOndeVeio("pinoFonte");
				pinoDestino->empilha(disco->getInfo());
			} else {
				Disco* disco = new Disco();
				disco->setInfo(pinoFonte->desempilha());
				disco->setOndeVeio("pinoFonte");
				pinoMeio->empilha(disco->getInfo());
			}
			primeiraJogada= false;
		}else{
			//????
		}
	}
}

Para a primeira jogada acredito que deva funcionar(não testei, pode estar errado, me avisem se souberem) porém para as jogadas posteriores não consigo pensar no algoritmo que obedeça essa regra " Nas outras jogadas mova o menor disco ocupando algum topo para o pino de onde ele não veio em uma jogada anterior; ". ALguem poderia me ajudar? E além disso criei um atributo chamado diametro disco para eu poder definir os tamanhos dos discos e saber qual deve ficar em cima de qual, porém mesmo com diametro não consegui entender como empilhar os discos de modo a respeitar o diametro de cada um.

Criado 20 de outubro de 2012
Ultima resposta 21 de out. de 2012
Respostas 1
Participantes 1