Ajuda com algoritmo

11/03/2018

0

Olá, sou iniciante em Java e gostaria de uma luz para a logica da torre de Hanoi. Preciso fazer o exercicio abaixo:
Faça um programa em Java com 3 vetores (A,B,C) no qual será inserido pelo usuário 10 valores no vetor A desordenadamente, você deve ordenar o vetor A de forma crescente e mover os valores para o vetor C de forma que os números sempre esteja ordenados. Abaixo segue os exemplos dos movimentos entre os vetores. (Utilize vetores, ordenação para o estado inicial do vetor A, e função).


Já fiz a organização do Vetor, porém minha dificuldade está sendo para fazer o algoritmo para resolver a torre. Até o momento fiz a logica abaixo.

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;
static int qtdb;
static int qtdc;

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++;
}
organizaA();
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 resolvehanoi() {
//executa a logica da torre de hanoi.

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

if ((a[qtda - 1] > 0) && (a[qtda - 1] < b[qtdb -1])) {
a[qtda - 1] = b[qtdb];
qtda--;
qtdb++;
} else {
a[qtda - 1] = c[qtdc];
}
if (b[qtdb - 1] > 0 && b[qtdb - 1] < c[qtdc - 1]) {
b[qtdb - 1] = c[qtdc];
qtdb--;
qtdc++;
} else {
a[qtda - 1] = b[qtdb];
qtda--;
qtdb++;
}
if (c[qtdc - 1] > 0 && c[qtdc - 1] < a[qtda - 1]) {
c[qtdc - 1] = a[qtda];
qtdc--;
qtda++;
} else {
c[qtdc - 1] = b[qtdb];
qtdc--;
qtdb++;
}
//if(){
// b[qtdb-1] = a[qtda];
// qtdb--;
// qtda++;
//}
}

public static void exibir() {
for (int i = 0; i > c.length; i++) {
System.out.println("Os números em C São: " + c[i]);
}
}
}

Desde já agradeço a atenção.
Diego Costa

Diego Costa

Responder

Posts

15/11/2018

Nelson Anjos

Olá aqui está com arraylist mas a lógica é a mesma. Espero q ajude.

import java.util.ArrayList;
import java.util.Collections;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

class Disco implements Comparable<Disco>{
      Integer index;
      String movimento;
      Disco(int index,String movimento){
         this.index=index;
         this.movimento=movimento;
      }
    public int compareTo(Disco o) {
        return index.compareTo(o.index);
    }
}
public class HanoiIterativo {
    private int qtDiscos;
    private String sequenciaImpares[] =   {"A-->C", "C-->B", "B-->A"};//para impares
    private String sequenciaPares  [] =   {"A-->B", "B-->C", "C-->A"};//para pares
    private List<Disco> arrayDiscos = new ArrayList<Disco>();
    public void lerDados() {
        System.out.println("Digite a quantidade de  discos");
        Scanner rc = new Scanner(System.in);
        try{
         qtDiscos = rc.nextInt();
        }catch(InputMismatchException e){
            System.out.println("Amigão! É fácil! Digite o número de discos por favor!");
            lerDados();
        }
    }
    public void hanoi() {
            int maxP=(int) Math.pow(2, qtDiscos);
            int y  = 1;
            int pos =1;
            while(y <= qtDiscos ){
                 int ctPulos = (int) Math.pow(2, y);
                 pos*=2;
                 if(y==1){
                     pos=1;
                 }
                 if(qtDiscos%2==0){
                  populaArrayPares(pos,ctPulos,maxP,y);
                 }else{
                  populaArrayImpares(pos,ctPulos,maxP,y);
                 }
                 y++;
           }
    }
    private void populaArrayPares(int pos,int intervalos, int maxP,int y){
           int index = 0;
           if(y%2==0){
               for (int i = pos; i <= maxP; i+=intervalos) {
                   Disco d = new Disco(i, sequenciaPares[index]);
                   arrayDiscos.add(d);
                   index++;
                   if(index>2){
                      index=0;
                   }
               }
           }else{
               for (int i = pos; i < maxP; i+=intervalos) {
                   Disco d = new Disco(i, sequenciaImpares[index]);
                   arrayDiscos.add(d);
                   index++;
                   if(index>2){
                      index=0;
                   }
               }
           }
        }
    private void populaArrayImpares(int pos,int intervalos, int maxP,int y){
       int index = 0;
       if(y%2==0){
           for (int i = pos; i < maxP; i+=intervalos) {
               Disco d = new Disco(i, sequenciaImpares[index]);
                   arrayDiscos.add(d);
                   index++;
                   if(index>2){
                      index=0;
                   }
               }
       }else{
          for (int i = pos; i <= maxP; i+=intervalos) {
               Disco d = new Disco(i, sequenciaPares[index]);
               arrayDiscos.add(d);
           index++;
           if(index>2){
              index=0;
           }
           }
       }
        }
    public static void main(String[] args) {
        HanoiIterativo h = new HanoiIterativo();
        h.lerDados();
        h.hanoi();
        Collections.sort(h.arrayDiscos);
        for (Disco d : h.arrayDiscos) {
             System.out.println("execute: "+d.index+"  "+d.movimento);
        }
    }
}
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar