Fórum Ajuda com algoritmo #591737
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)