codice:public Hanoi(int disks,Pannello pann) { this.pannello=pann; this.disks = disks; pannello.CampoDaGioco(disks); this.pioli = new int[3][disks]; for(int i=0;i<disks;i++) { pioli[0][i] = i+1; pioli[1][i] = 0; pioli[2][i] = 0; } //Disposizione iniziale dei pioli System.out.println("Start!"); display(); moveDisks(disks, 0, 2, 1); } public void moveDisks(int disks, int from, int to, int empty) { if(disks == 1) { System.out.println("muove da "+from+" a "+to); move(from, to); } else { moveDisks(disks-1,from, empty, to); System.out.println("muove da "+from+" a "+to); move(from, to); moveDisks(disks-1,empty, to, from); } } public void move(int from, int to) { int i=0; while( (pioli[from][i] == 0) && (i<disks) ) i++; int tmpFrom=0; if (i==disks) tmpFrom=disks-1; else tmpFrom=i; i=disks-1; while( (pioli[to][i] != 0) && (i>0) ) i--; pioli[to][i] = pioli[from][tmpFrom]; pioli[from][tmpFrom] = 0; display(); } public void display() { for(int j=0;j<disks;j++) { for(int i=0;i<3;i++) System.out.print(" "+pioli[i][j]+" "); System.out.println(""); } System.out.println(""); pannello.disponiDischi(pioli,"IL NUMERO DI MOSSE NECESSARIE E' -------> " +numMosse); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
salve a tutti. ho bisogno di un'aiuto.. ho preso questo pezzo di programma delle torri di hanoi che utilizzza un approccio ricorsivo.
c'è anche la parte grafica(ignorate pannello e tutti i metodi che non sono presenti nel pezzo di programma che vi ho postato),
Vi espongo il problema. ho fatto l'esempio con 3 dischi..
for(int i=0;i<disks;i++)
{
pioli[0][i] = i+1;
pioli[1][i] = 0;
pioli[2][i] = 0;
questo primo for mi crea le condizioni iniziali, ovvero tutti i dischi sul primo piolo.. e fino qui ci siamo.
ora , si vede che chiamo in modo ricorsimo il metodo movedisks fino a che disks(decrementato a ogni chiamata ricorsiava del metodo) arrva a uno.
il metodo movedisk, quando disk=1 passa questi parametri(1,0,2,1)(che sono rispettivamente il numero di diski ,il piolo from,il piolo di arrivo to, e
il piolo vuoto empty).allora chiamo il metodo move, passandogli (0,2)( che sono i pioli from e to).e qui incominciano i problemi.
praticamente con questa operazione move(0,2) mi dovrebbe spostare il disco più piccolo(quello nella posizione (0,2), nella posizione(2,0)(che sarebbe l'ultimo piolo).
tuttavia se analizzo lo script del metodo move, vedo che:
-non entra nel primo while(poichè piolo[from][i] è diverso da 0]
_calcola tmpFrom che è uguale i(=0), (la condizione nell'if)
- e poi ricalcola i che è ugual a disks-1(ovvero disks=1, e quindi i =0)
quidni ho che tmpFrom=0 e i =0, ma nell'assegnazione pioli[to][i] = pioli[from][tmpFrom];, associa quindi che la posizione (2,0)
ovvero l'ultimo piolo è uguale a (0,0) cioè gli associa il disco più grande..Ma non dovrebbe associare il disco più piccolo
ovvero la cima del primo piolo invece che la base????????
aiutatemi perfavore perchè c'è qualcosa che mi sfugge

Rispondi quotando