Search This Blog

Showing posts with label solving. Show all posts
Showing posts with label solving. Show all posts

Java Program for Animated Solution for Tower of Hanoi Puzzle Problem

This is a java program to solve towers of hanoi puzzle problem. This java program give solution for tower of hanoi problem with any number of disks. This program gives animated solution for tower of Hanoi problem. It demonstrates solving the tower of hanoi problem using animation in java.

The solution of hanoi problem given by this program is always optimal. You can enter the number of disks first. This lets you solve puzzle of any level of difficulty. The program is as follows.


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class HanoiAnimated extends JPanel{

static int tower[][];// the three towers' disks as stack
static int top[];//top of the three stacks
static int from,to;//moving 'from' tower number 'to' tower number
static int diskInAir;//number of disk moved (1 to n)
static int n,l,b,u;
static Color colors[]={Color.BLUE,Color.CYAN,Color.GREEN,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.YELLOW};
public HanoiAnimated()
{
    tower=new int[3][10];
    top=new int[3];
}

static void push(int to, int diskno)
//putting disk on tower
{
tower[to-1][++top[to-1]]=diskno;
}

static int pop(int from)
//take topmost disk from tower
{
return(tower[from-1][top[from-1]--]);
}

Color getColor(int disknum)
{
return colors[disknum%8];
}

void drawStill(Graphics g)
{
int j,i,disk;
g.clearRect(0,0,getWidth(),getHeight());
for(j=1;j<=3;j++)
 {
 //draw tower
        g.setColor(Color.GRAY);
 g.fillRoundRect(j*l,u,5,b-u,1,1);
        
 //draw all disks on tower
 for(i=0;i<=top[j-1];i++)
  {
  disk=tower[j-1][i];
                g.setColor(getColor(disk));
  g.fillRect(j*l-15-disk*5,b-(i+1)*10,35+disk*10,10);
  }
 }
}

void drawFrame(Graphics g,int x,int y)
{
try{
drawStill(g);
g.setColor(getColor(diskInAir));
g.fillRect(x-15-diskInAir*5,y-10,35+diskInAir*10,10);
Thread.sleep(60);
}catch(InterruptedException ex){}
}

void animator(Graphics g)
//to show the movement of disk
{
int x,y,dif,sign;
diskInAir=pop(from);
x=from*l;
y=b-(top[from-1]+1)*10;
//taking disk upward from the tower
for(;y>u-20;y-=8)
 drawFrame(g, x, y);

y=u-20;
dif=to*l-x;
sign=dif/Math.abs(dif);
//moving disk towards a target tower
for(;Math.abs(x-to*l)>=24;x+=sign*12)
 drawFrame(g, x, y);
x=to*l;
//placing disk on a target tower
for(;y<b-(top[to-1]+1)*10;y+=8)
 drawFrame(g, x, y);
push(to,diskInAir);
drawStill(g);
}

void moveTopN(Graphics g, int n, int a, int b, int c) throws InterruptedException
//Move top n disk from tower 'a' to tower 'c'
//tower 'b' used for swapping
{
if(n>=1)
 {
 moveTopN(g,n-1,a,c,b);
 drawStill(g);
 Thread.sleep(700);
 from=a;
 to=c;
 //animating the move
 animator(g);
 moveTopN(g,n-1,b,a,c);
 }
}

public static void main(String[] args)
{

int i;
String s=JOptionPane.showInputDialog("Enter number of disks");
n=Integer.parseInt(s);
HanoiAnimated ha=new HanoiAnimated();
//setting all tower empty
for(i=0;i<3;i++)
 top[i]=-1;

//putting all disks on tower 'a'
for(i=n;i>0;i--)
 {
 push(1,i);
 }

JFrame fr=new JFrame();
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setLayout(new BorderLayout());
fr.setSize(640,360);
fr.add(ha);
ha.setSize(fr.getSize());
fr.setVisible(true);
l=ha.getWidth()/4;
b=ha.getHeight()-50;
u=b-n*12;
//start solving
try{
ha.moveTopN(ha.getGraphics(),n,1,2,3);
}catch(Exception ex){}
}

}