首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

新手求教动态八皇后有关问题!

2012-12-20 
新手求教动态八皇后问题!!!已经有了棋盘的代码还有八皇后的代码应该要怎样让八皇后在棋盘上显示呢!棋盘代

新手求教动态八皇后问题!!!
已经有了棋盘的代码还有八皇后的代码应该要怎样让八皇后在棋盘上显示呢!
棋盘代码:
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);
    if((i+j)%2==0)
    {     //当小方格的坐标和刚好是偶数时,
     l.setBackground(Color.black);   //设置为方格为黑色
     l.setOpaque(true);   //设置为不透明 
    }
    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);
 }
}

八皇后代码:
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;
        }
    }
    
    
    /**
     * 对棋盘的初始化
     * @param queenLocation 
     */
    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]="-";
            }
        }
[最优解释]

package com.tur.demo;

import javax.swing.*;
import java.awt.*;

public class EightQueen {
    public static int num = 1;
    private QueenShower queenShower = null;

    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)) {
                // 调用JPanel.repaint()显示
                queenShower.showQueen(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]
                        
[其他解释]
  }
    /**


     *打印棋盘
     * @param queenLocation
     * @param num 
     */
    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)+"种解决方案,呵呵,效果还不错吧O(∩_∩)O");
    }
}

[其他解释]
 (c[i] - c[currentQueenNum]) == (i - currentQueenNum)
                        
[其他解释]
 (c[i] - c[currentQueenNum]) == (currentQueenNum - i))
                    return false;
            }
            return true;
        }
    }


    /**
     * 对棋盘的初始化
     *
     * @param queenLocation
     */
    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] = "-";
            }
        }
    }

    /**
     * 打印棋盘
     *
     * @param queenLocation
     * @param num
     */
    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 void setQueenShower(QueenShower queenShower) {
        this.queenShower = queenShower;
    }

    public static void main(String[] args) {
        QueenShower shower = new QueenShower();

        // 设置显示窗口
        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();
        shower.setDelay(100); // 设置动画暂停时间
        shower.setDelayOfEnd(3000);
        queen.setQueenShower(shower);
        int queenNumber = 8;//皇后数量
        queen.Queen(queenNumber);
        System.out.println("总共有" + (num - 1) + "种解决方案,呵呵,效果还不错吧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 offsetX = 2, offsetY = 2; // gaps between the frame
        int x = 0, y = 0;
        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);
        }
    }
}

热点排行