69,371
社区成员
发帖
与我相关
我的任务
分享
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);
}
}
}