当前位置: 代码迷 >> J2SE >> 一个汉诺塔自动演示的有关问题
  详细解决方案

一个汉诺塔自动演示的有关问题

热度:44   发布时间:2016-04-24 02:04:15.0
一个汉诺塔自动演示的问题~
想实现一个3阶汉诺塔的自动演示,主要是想看到每次移动的过程,但是用Timer或者Thread.sleep都弄不好```
求大侠帮忙看看应该怎么弄~
Java code
import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class HanoiDemo extends JFrame {    private panel p = new panel();        public HanoiDemo() {        add(p);    }        public void doDemo() {        p.moveDisks(3, 'A', 'B', 'C');    }        private class panel extends JPanel {        private int xA;        private int xB;        private int xC;                private int numbersOfA = 3;        //柱子盘子的数目        private int numbersOfB = 0;        private int numbersOfC = 0;                private int[] disksOfA = new int[]{3, 2, 1};   //柱子上放盘子情况        private int[] disksOfB = new int[]{0, 0, 0};        private int[] disksOfC = new int[]{0, 0, 0};                            private Timer timer = new Timer(100, new ActionListener() {                        @Override            public void actionPerformed(ActionEvent arg0) {                // TODO Auto-generated method stub                repaint();            }        });                public void paintComponent(Graphics g) {            super.paintComponent(g);                        xA = getWidth() / 4;            xB = getWidth() / 2;            xC = getWidth() / 4 * 3;            g.drawRect(xA - 10, getHeight() / 4, 20, getHeight() / 4 * 3);            g.drawRect(xB - 10, getHeight() / 4, 20, getHeight() / 4 * 3);            g.drawRect(xC - 10, getHeight() / 4, 20, getHeight() / 4 * 3);                            if (numbersOfA != 0) {                for (int i = 0; i < 3; i++) {                    if (disksOfA[i] != 0)                        g.fillRect(xA - 10 - disksOfA[i] * 10, getHeight() - 20 - i * 20, 20 + disksOfA[i] * 20, 20);                }            }                        if (numbersOfB != 0) {                for (int i = 0; i < 3; i++) {                    if (disksOfB[i] != 0)                        g.fillRect(xB - 10 - disksOfB[i] * 10, getHeight() - 20 - i * 20, 20 + disksOfB[i] * 20, 20);                }            }                        if (numbersOfC != 0) {                for (int i = 0; i < 3; i++) {                    if (disksOfC[i] != 0)                        g.fillRect(xC - 10 - disksOfC[i] * 10, getHeight() - 20 - i * 20, 20 + disksOfC[i] * 20, 20);                }            }        }                public void moveDisks(int n, char fromTower, char toTower, char auxTower) {                                try {                                Thread.sleep(500);                                        repaint();                    } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }     //本来想用sleep来看每次移动的过程,但动作一卡一卡的                if (n == 1){ // Stopping condition                    System.out.println("Move disk " + n + " from " +                            fromTower + " to " + toTower);                    if (fromTower == 'A') {                        if (toTower == 'B') {                            move(disksOfA, disksOfB);                            numbersOfA--;                            numbersOfB++;                        }                        else {                            move(disksOfA, disksOfC);                            numbersOfA--;                            numbersOfC++;                        }                    }                         if (fromTower == 'B') {                        if (toTower == 'A') {                            move(disksOfB, disksOfA);                            numbersOfB--;                            numbersOfA++;                        }                        else {                            move(disksOfB, disksOfC);                            numbersOfB--;                            numbersOfC++;                        }                    }                            if (fromTower == 'C') {                        if (toTower == 'B') {                            move(disksOfC, disksOfB);                            numbersOfC--;                            numbersOfB++;                        }                        else {                            move(disksOfC, disksOfA);                            numbersOfC--;                            numbersOfA++;                        }                    }                            }                                else {                  moveDisks(n - 1, fromTower, auxTower, toTower);                  System.out.println("Move disk " + n + " from " +                    fromTower + " to " + toTower);                  if (fromTower == 'A') {                        if (toTower == 'B') {                            move(disksOfA, disksOfB);                            numbersOfA--;                            numbersOfB++;                        }                        else {                            move(disksOfA, disksOfC);                            numbersOfA--;                            numbersOfC++;                        }                    }                         if (fromTower == 'B') {                        if (toTower == 'A') {                            move(disksOfB, disksOfA);                            numbersOfB--;                            numbersOfA++;                        }                        else {                            move(disksOfB, disksOfC);                            numbersOfB--;                            numbersOfC++;                        }                    }                            if (fromTower == 'C') {                        if (toTower == 'B') {                            move(disksOfC, disksOfB);                            numbersOfC--;                            numbersOfB++;                        }                        else {                            move(disksOfC, disksOfA);                            numbersOfC--;                            numbersOfA++;                        }                    }                              moveDisks(n - 1, auxTower, toTower, fromTower);                }         }                public void move(int[] from, int[] to) {            int i = 2;            while (from[i] == 0) {                i--;            }            int moveDisk = from[i];            from[i] = 0;            i = 0;            while (to[i] != 0) {                i++;            }            to[i] = moveDisk;        }        }            public static void main(String[] args) {        // TODO Auto-generated method stub        HanoiDemo frame = new HanoiDemo();        frame.setTitle("HanoiDemo");        frame.setLocationRelativeTo(null);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.setSize(300, 300);        frame.setVisible(true);        frame.doDemo();    }}


------解决方案--------------------
Java code
        public static void move(int size,String from,String temp,String to){        if (size == 1) {            System.out.println("把"+size+"#从"+from+"移动到"+to);        }else {            move(size - 1, from, to, temp); //from-->inner            System.out.println("把"+size+"#从"+from+"移动到"+to);            move(size - 1, temp, from, to); //inner-->to        }    }
  相关解决方案