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:
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.
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
Curtir tópico
+ 0
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
Clique aqui para fazer login e interagir na Comunidade :)