Ajuda com Torre de Hanoi

0 respostas
java
Diego_Souza1

Preciso de ajuda para resolver o seguinte problema.
Preciso coletar 10 números desordenados no Vetor A, depois organiza-los e passar eles para o Vetor C com a logica da torre de Hanoi.
Fiz 1 subrotina pra cada movimento.
Porém está dando erro quando a Pilha B possui 0 números. O certo seria passar para a proxima subrotina de jogar quem está no topo de C para A, porem o programa morre ali. Podem me auxiliar por gentileza?

Segue o codigo.

import javax.swing.JOptionPane;

public class Trabalho1 {

static int a[] = new int[10]; // Números desordenados/origem
static int b[] = new int[10]; //pilar de trabalho
static int c[] = new int[10]; //pilar destino
static int qtda; //Contador de quantos numeros tem em A.
static int qtdb; //Contador de quantos numeros tem em B.
static int qtdc; //Contador de quantos numeros tem em C.

public static void main(String[] args) {

    // recebe os números digitados pelo usuário  
    for (int i = 0; i < a.length; i++) {
        a[i] = Integer.parseInt(JOptionPane.showInputDialog("Digite os números: "));
        qtda++;
    }
//Chama as rotinas de organizar o Vetor A, distribuir o topo de A para B e C, depois resolve o problema de Hanoi.

organizaA();

DistribuiBeC();

resolvehanoi();
}

public static void organizaA() {

//organiza o pilar origem

int aux;

    for (int i = 0; i < a.length; i++) {
        for (int j = 1; j < a.length; j++) {
            if (a[j - 1] < a[j]) {
                aux = a[j];
                a[j] = a[j - 1];
                a[j - 1] = aux;

            }
        }
    }
}

public static void DistribuiBeC() {
    //O pilar B e C recebem quem está no topo do Pilar A
    b[qtdb] = a[qtda - 1];
    qtdb++;
    qtda--;

    c[qtdc] = a[qtda - 1];
    qtdc++;
    qtda--;
}

public static void AtoB() {
    //Topo de A vai para B
    b[qtdb] = a[qtda - 1];
    qtdb++;
    qtda--;
}

public static void AtoC() {
    //Topo de A vai para C
    c[qtdc] = a[qtda - 1];
    qtdc++;
    qtda--;
}

public static void BtoC() {
    //Topo de B vai para C
    c[qtdc] = b[qtdb - 1];
    qtdc++;
    qtdb--;
}

public static void BtoA() {
    //Topo de B vai para A
    b[qtdb] = a[qtda - 1];
    qtdb++;
    qtda--;
}

public static void CtoA() {
    //Topo de C vai para A
    a[qtda] = c[qtdc - 1];
    qtda++;
    qtdc--;
}

public static void CtoB() {
    //Topo de C vai para B
    b[qtdb] = c[qtdc - 1];
    qtdb++;
    qtdc--;
}

public static void resolvehanoi() {

//executa a logica da torre de hanoi. Se um numero da Pilha “X” for maior que o numero da pilha “Y” ele envia quem está no topo para pilha “Z” e vice versa.
//Se a Pilha A e a Pilha B chegarem a 0, ele chama o metodo para exibir os dados que se encontram em C.

if ((qtda == 0) && (qtdb == 0)) {
        exibir();
    }

    if (a[qtda - 1] < b[qtdb - 1]) {
        AtoB();
    }
    if ((a[qtda - 1] > b[qtdb - 1]) && (a[qtda - 1] < c[qtdc - 1])) {
        AtoC();
    }

    if ((b[qtdb - 1] > 0) && (b[qtdb - 1] < c[qtdc - 1])) {
        BtoC();
    }
    if ((b[qtdb - 1] > 0) && (b[qtdb - 1] > c[qtdc - 1]) && (b[qtdb - 1] < a[qtda - 1])) {
        BtoA();
    }

    if ((c[qtdc - 1] > 0) && (c[qtdc - 1] < a[qtda - 1])) {
        CtoA();
    } else {
        CtoB();
    }

}

public static void exibir() {
    //Exibi os dados na pilha C.
    for (int i = 0; i < c.length; i++) {
        System.out.println("Os números em C São: " + c[i] + " A " + a[i] + " B " + c[i]);
    }
}

}

Criado 11 de março de 2018
Respostas 0
Participantes 1