import java.awt.*;
import javax.swing.*;
public class EightQueens extends JApplet {
public static final int SIZE = 8;
private int[] queens = {-1, -1, -1, -1, -1, -1, -1, -1};
public EightQueens() {
if (search())
add(new ChessBoard(), BorderLayout.CENTER);
else
JOptionPane.showMessageDialog(null, "No solution found");
}
private boolean search() {
int k = 0;
while (k >= 0 && k < SIZE) {
int j = findPosition(k);
if (j < 0) {
queens[k] = -1;
k--;
} else {
queens[k] = j;
k++;
}
}
if (k == -1)
return false;
else
return true;
}
public int findPosition(int k) {
int start = queens[k] + 1;
for (int j = start; j < SIZE; j++) {
if (isValid(k, j))
return j;
}
return -1;
}
public boolean isValid(int row, int column) {
for (int i = 1; i <= row; i++)
if (queens[row - i] == column
|| queens[row - i] == column - i
|| queens[row - i] == column + i)
return false;
return true;
}
class ChessBoard extends JPanel {
private java.net.URL url
= getClass().getResource("image/queen.jpg");
private Image queenImage = new ImageIcon(url).getImage();
ChessBoard() {
setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < SIZE; i++) {
int j = queens[i];
g.drawImage(queenImage, j * getWidth() / SIZE,
i * getHeight() / SIZE, getWidth() / SIZE,
getHeight() / SIZE, this);
}
for (int i = 1; i < SIZE; i++) {
g.drawLine(0, i * getHeight() / SIZE,
getWidth(), i * getHeight() / SIZE);
g.drawLine(i * getWidth() / SIZE, 0,
i * getWidth() / SIZE, getHeight());
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("EightQueens");
EightQueens applet = new EightQueens();
frame.add(applet, BorderLayout.CENTER);
applet.init();
applet.start();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}