老师要求写八皇后的动态演示。现在已经做出了棋盘还有八皇后的代码,但是怎样在棋盘上实现八皇后???

解决方案 »

  1.   

    把当前棋盘上皇后的状态保存在一个数组里。
    每走一步,就调用JPanel.repaint()方法更新显示棋盘。
    在JPanel.paintComponent里读取皇后状态的数组显示他们。
      

  2.   

    import java.awt.Color;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;public class Chess extends JPanel
    {// 继承面板类
     public Chess(int grids,int gridsize)
     {//grids:行数和列数, gridsize:单元格的高和宽
       super(null);
      for(int i=0; i<grids; i++)
      {
       for(int j=0; j<grids; j++)
       {
        JLabel l = new JLabel();//生成标签实例
        l.setSize(gridsize,gridsize);
        l.setLocation(i*gridsize,j*gridsize);
        l.setBorder(BorderFactory.createLineBorder(Color.black));   //设置边界为黑色
        add(l);//将l标签添加到面板
       }
      }
     }public static void main(String[] args)
     {
      JFrame f = new JFrame();
      f.setSize(658,677);   //边框的长和宽
      f.setLocationRelativeTo(null);   //设置窗口相对于指定组件的位置
      f.add(new Chess(8,80));
      f.setVisible(true);
     }
    }
    这是棋盘代码,具体要从哪里入手?
      

  3.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class EightQueen {
        public static int num=1;
        public void Queen(int queenNum)
        {
            String queenLocation[][]=new String[queenNum][queenNum];
            
            //init(queenLocation);
            System.out.println("总的解决方案如下:");
            int c[]=new int[queenNum];
            advance(0, queenNum, c, queenLocation);
        }
        
        private void advance(int k,int queenNum ,int c[],String queenLocation[][])
        {
             for(int col=0;col<queenNum;col++)
            {
                c[k]=col;
                if(isSafe(c, k))
                {
                    if(k==queenNum-1)
                    {
                        init(queenLocation);
                        for(int i=0;i<queenNum;i++)//填充棋盘
                        {
                            queenLocation[i][c[i]]="*";  
                        }
                        printQueen(queenLocation, num++);//打印出当前的可行方案
                    }else
                    {
                        advance(k+1,queenNum,c,queenLocation);
                    }
                }
            }
        }
        
        private boolean isSafe(int c[],int currentQueenNum)
        {
            //当前是第几个皇后,当前和皇后依次和前面的皇后比较
            //currentQueenNum表示当前是第几个皇后
            if(currentQueenNum==0)
                return true;
            else
            {
                for(int i=0;i<currentQueenNum;i++)
                {
                    if(c[i]==c[currentQueenNum]||(c[i]-c[currentQueenNum])==(i-currentQueenNum)||(c[i]-c[currentQueenNum])==(currentQueenNum-i))
                        return false;
                }
                return true;
            }
        }
        
       
     
        private void init(String [][]queenLocation)
        {
            int n=queenLocation.length;
            
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                        queenLocation[i][j]="-";
                }
            }
        }
       
        private void printQueen(String [][]queenLocation ,int num)
        {
            int n=queenLocation.length;
            String queenString="";
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(j==(n-1)){
                        queenString+=queenLocation[i][j]+"\n";
                    }
                    else{
                         queenString+=queenLocation[i][j]+"   ";
                    }
                }
            }
            System.out.println("第"+num+"种解决方案:");
            System.out.println(queenString);
        }
        
        public static void main(String []args)
        {
            EightQueen queen=new EightQueen();
            int queenNumber=8;//皇后数量
            queen.Queen(queenNumber);
            System.out.println("总共有"+(num-1)+"种解决方案");
        }
    }这是八皇后的代码
      

  4.   

    在你的代码上作了些不必要的修改
    package com.tur.demo;import javax.swing.*;
    import java.awt.*;public class EightQueen {
        public static int num = 0;
        private QueenShower queenShower = null;    public void Queen(int queenNum) {
            // 因为每行只有一个皇后,所以用一维数组存储皇后状态,元素值为皇后在这一行的列值
            int c[] = new int[queenNum];
            advance(0, queenNum, c);
        }    private void advance(int k, int queenNum, int c[]) {
            for (int col = 0; col < queenNum; col++) {
                c[k] = col;
                if (isSafe(c, k)) {
                    // 调用JPanel.repaint()显示
                    if (queenShower != null) queenShower.showQueen(c, k);                if (k == queenNum - 1) {
                        num++;
                        printQueen(c);//打印出当前的可行方案
                    } else {
                        advance(k + 1, queenNum, c);
                    }
                }
            }
        }    private boolean isSafe(int c[], int currentQueenNum) {
            //当前是第几个皇后,当前和皇后依次和前面的皇后比较
            //currentQueenNum表示当前是第几个皇后
            for (int i = 0; i < currentQueenNum; i++) {
                // 方阵中的对角线性质:(a, b) 的下面的对角是 (a + n, b + n)或者(a -n, b + n)
                if (c[i] == c[currentQueenNum]
                        || (c[i] - c[currentQueenNum]) == (i - currentQueenNum)
                        || (c[i] - c[currentQueenNum]) == (currentQueenNum - i))
                    return false;
            }
            return true;
        }
        /**
         * 对棋盘的初始化
         *
         * @param queenLocation
         */
        private void initQueenLocation(char[][] queenLocation) {
            int n = queenLocation.length;        for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    queenLocation[i][j] = '-';
                }
            }
        }    /**
         * 打印棋盘
         */
        private void printQueen(int[] status) {
            char queenLocation[][] = new char[status.length][status.length];        //填充棋盘
            initQueenLocation(queenLocation);
            for (int i = 0; i < status.length; i++) {
                queenLocation[i][status[i]] = '*';
            }        int n = status.length;
            StringBuilder queenString = new StringBuilder();
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    queenString.append(queenLocation[i][j]);                if (j == (n - 1)) {
                        queenString.append("\n");
                    } else {
                        queenString.append("   ");
                    }
                }
            }        System.out.println("第" + num + "种解决方案:");
            System.out.println(queenString);
        }    public void setQueenShower(QueenShower queenShower) {
            this.queenShower = queenShower;
        }    public static void main(String[] args) {
            QueenShower shower = new QueenShower();
            shower.setDelay(10); // 设置动画暂停时间
            shower.setDelayOfEnd(3000);        // 设置显示窗口
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 500);
            frame.setLocationRelativeTo(null);
            frame.getContentPane().add(shower);
            frame.setVisible(true);        // 创建EightQueen
            EightQueen queen = new EightQueen();
            queen.setQueenShower(shower);
            int queenNumber = 8;//皇后数量
            queen.Queen(queenNumber);
            System.out.println("总共有" + num + "种解决方案,呵呵,效果还不错吧O(∩_∩)O");
        }
    }/**
     * 用来显示皇后状态的Panel
     */
    class QueenShower extends JPanel {
        private int currentRow = 0; // 当前是第几行
        private int[] status = null; // 皇后状态数组
        private int delay = 100; // 动画暂停时间
        private int delayOfEnd = 5000; // 找到解决方暂停的时间,停久点可以方便看到解决方案    public QueenShower() {
        }    public int getDelay() {
            return delay;
        }    public void setDelay(int delay) {
            this.delay = delay;
        }    public int getDelayOfEnd() {
            return delayOfEnd;
        }    public void setDelayOfEnd(int delayOfEnd) {
            this.delayOfEnd = delayOfEnd;
        }    public void showQueen(int[] status, int currentRow) {
            this.status = status;
            this.currentRow = currentRow;
            this.repaint();        try {
                // 找到解决方案的时候,多停一会
                Thread.sleep((currentRow == status.length - 1) ? delayOfEnd : delay);
            } catch (InterruptedException e) {
            }
        }    @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); // 使用Swing自带的双缓冲清除上一帧的痕迹        if (status == null) { return; }        int x = 0, y = 0;
            int offsetX = 2, offsetY = 2; // gaps between the frame
            Dimension size = getSize();
            int cellWidth = (size.width - offsetX - offsetX) / status.length;
            int cellHeight = (size.height - offsetY - offsetY) / status.length;        // Draw row grid lines
            int width = status.length * cellWidth;
            for (int i = 0; i <= status.length; ++i) {
                g.drawLine(0 + offsetX, y + offsetY, width + offsetX, y + offsetY);
                y += cellHeight;
            }        // Draw column grid lines
            int height = status.length * cellHeight;
            for (int i = 0; i <= status.length; ++i) {
                g.drawLine(x + offsetX, offsetY, x + offsetX, height + offsetY);
                x += cellWidth;
            }        // Draw queens
            for (int i = 0; i <= currentRow; ++i) {
                x = status[i] * cellWidth;
                y = i * cellHeight;            g.fillRect(x + offsetX, y + offsetY, cellWidth, cellHeight);
            }
        }
    }
      

  5.   

    http://bbs.csdn.net/topics/390298088
    80分的 算法题