- import java.awt.*;
- public class Hanoi
- {
- private int n;
- private int target;
- private int counter;
- private int[] ptr;
- private int[][] tower;
- private Point[] loc;
- private String[] args;
- public static void main(String[] args)
- {
- Hanoi h = new Hanoi(args);
- h.solve();
- }
- Hanoi(String[] args)
- {
- this.args = args;
- public void solve()
- {
- init();
- if(parse(args))
- {
- startHanoi();
- }
- else
- {
- System.out.printf("args should have two strings.\n");
- }
- }
- private void init()
- {
- tower = new int[3][];
- ptr = new int[3];
- counter = 0;
- }
- private boolean parse(String[] args)
- {
- int i;
- char ch;
- if(args.length < 2)
- {
- return false;
- }
- n = args[0].length();
- target = args[1].charAt(0) - 65;
- for(i=0; i<3; i++)
- {
- tower[i] = new int[n];
- }
- loc = new Point[n];
- for(i=n-1; i>=0; i--)
- {
- ch = args[0].charAt(i);
- tower[ch-65][ptr[ch-65]++] = i;
- loc[i] = new Point(ch-65, ptr[ch-65]-1);
- }
- return true;
- }
- private void startHanoi()
- {
- int i;
- printResult();
- for(i=1; i<n; i++)
- {
- move(i-1, loc[i-1].x, loc[i].x);
- }
- move(n-1, loc[n-1].x, target);
- }
- private void move(int dish, int now, int targ)
- {
- int tmp;
- if(now == targ)
- {
- return;
- }
- tmp = 3 - now - targ;
- if(dish > 0)
- {
- move(dish-1, now, tmp);
- }
- loc[dish] = new Point(targ, ptr[targ]);
- ptr[now]--;
- tower[targ][ptr[targ]++] = dish;
- printResult();
- if(dish > 0)
- {
- move(dish-1, tmp, targ);
- }
- }
- private void printResult()
- {
- int i, j;
- System.out.printf("%4d:", ++counter);
- for(i=0; i<3; i++)
- {
- System.out.print(" [");
- for(j=0; j<ptr[i]; j++)
- {
- System.out.printf("%d", tower[i][j]+1);
- }
- for(j=ptr[i]; j<n; j++)
- {
- System.out.print(" ");
- }
- System.out.print("]");
- }
- System.out.printf("\n");
- }
- }
Raw Paste