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

如何把八皇后有关问题用c语言做出来图形界面,下面是八皇后的运行程序

2013-07-08 
怎么把八皇后问题用c语言做出来图形界面,下面是八皇后的运行程序package com.tur.demoimport javax.swing

怎么把八皇后问题用c语言做出来图形界面,下面是八皇后的运行程序

如何把八皇后有关问题用c语言做出来图形界面,下面是八皇后的运行程序

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 pos[] = new int[queenNum];
        advance(0, queenNum, pos);
    }

    private void advance(int row, int queenNum, int pos[]) {


        for (int col = 0; col < queenNum; col++) {
            pos[row] = col;
            if (isSafe(pos, row)) {
                // 调用JPanel.repaint()显示
                if (queenShower != null) queenShower.showQueen(pos, row);

                if (row == queenNum - 1) {
                    num++;
                    printQueen(pos);//打印出当前的可行方案
                } else {
                    advance(row + 1, queenNum, pos);
                }
            }
        }
    }

    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;
    }

    /**
     * 打印棋盘
     */
    private void printQueen(int[] status) {
        int n = status.length;
        StringBuilder queenString = new StringBuilder();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                queenString.append((j == status[i]) ? '*' : '-');
                queenString.append((j == (n - 1)) ? "\n" : "   ");
            }
        }

        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);
        }


    }
}

热点排行