Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

A chessboard contains 64 squares that form 8 rows and 8 columns. The most powerf

ID: 3544251 • Letter: A

Question

A chessboard contains 64 squares that form 8 rows and 8 columns. The most powerful piece in the game of chess is the queen because it can attack any other piece within its row, within its column, or along its diagonal.


Write a recursive program in java to place eight queens on a chessboard so that no queen can attack any other queen.  The program must clear the screen and draw a rectangular array of 8 rows by 8 columns of squares that will represent a chessboard.  The program must then place all eight queens on the board such that no queen can threaten any other queen.

Explanation / Answer


import javax.swing.*;

import java.awt.*;

import java.awt.geom.*;

import java.awt.event.*;


public class JRQueens extends JFrame implements Runnable

{

public ChessSquare [][] squares;

public boolean [] saferow;   

public boolean [] safeleftdiag;

public boolean [] saferightdiag;


private ShapePanel drawPanel;

private JLabel info;

private JButton runDemo; // button to allow interaction

private Thread runThread; // thread to allow "motion"

private int delay; // delay between moves

private PauseClass pauser; // class to allow execution to pause in between

// solutions -- see details in definition below

private boolean paused; // is execution paused? true or false

private int sol, calls;


public JRQueens(int delta)

{

super("Interactive 8 Queens Problem");

delay = delta;

drawPanel = new ShapePanel(450, 450);


runDemo = new JButton("See Solutions"); // Set up button

ButtonHandler bhandler = new ButtonHandler();

runDemo.addActionListener(bhandler);


info = new JLabel("The 8 Queens Problem", (int) CENTER_ALIGNMENT);


Container c = getContentPane(); // Set up layout

c.add(drawPanel, BorderLayout.CENTER);

c.add(info, BorderLayout.NORTH);

c.add(runDemo, BorderLayout.SOUTH);


squares = new ChessSquare[8][8]; // initialize variables

saferow = new boolean[8];

safeleftdiag = new boolean[15];

saferightdiag = new boolean[15];

int size = 50;

int offset = 25;

for (int row = 0; row < 8; row++)

{

saferow[row] = true; // all rows are safe

for (int col = 0; col < 8; col++)

{

squares[row][col] = new ChessSquare(offset + col*size,

offset + row*size,

size, size);

}

}

for (int i = 0; i < 15; i++)

{ // initialize all diagonals to safe

safeleftdiag[i] = true;

saferightdiag[i] = true;

}

sol = 0;

calls = 0;


runThread = null;


setSize(475, 525);

setVisible(true);

}



public boolean safe(int row, int col)

{

return (saferow[row] && safeleftdiag[row+col] &&

saferightdiag[row-col+7]);

}


// This recursive method does most of the work to solve the problem.

public void trycol(int col)

{

calls++;

for (int row = 0; row < 8; row++) // try all rows if necessary

{

if (safe(row, col))

{

// if the current position is free from a threat, put a queen

// there and mark the row and diags as unsafe


saferow[row] = false;

safeleftdiag[row+col] = false;

saferightdiag[row-col+7] = false;

(squares[row][col]).occupy();

repaint();

if (col == 7) // queen safely on every column, announce

{ // solution and pause execution

sol++;

info.setText("Solution " + sol + " Found After " + calls + " Calls");

runDemo.setText("Click to Continue");

runDemo.setEnabled(true);

pauser.pause();

}

else

{

// Still more columns left to fill, so delay a bit and then

// try the next column recursively

try

{

Thread.sleep(delay);

}

catch (InterruptedException e)

{

System.out.println("Thread error B");

}


trycol(col+1); // try to put a queen onto the next column

}


saferow[row] = true; // remove the queen from

safeleftdiag[row+col] = true; // the current row and

saferightdiag[row-col+7] = true; // unset the threats. The

(squares[row][col]).remove(); // loop will then try the

// next row down

}

}

}


// This method executes implicitly when the Thread is started.

public void run()

{

paused = false;

pauser = new PauseClass();

trycol(0);

repaint();

info.setText("Program Completed: " + sol + " Solutions, "

+ calls + " Calls, "

+ (8*calls) + " iterations ");

}


public static void main(String [] args)

{

// Use the delay value entered by the user, or use 100 if no

// value is entered.

int delay;

if (args != null && args.length >= 1)

delay = Integer.parseInt(args[0]);

else

delay = 100;

JRQueens win = new JRQueens(delay);


win.addWindowListener(

new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{ System.exit(0); }

}

);

}


// This class is used to enable the execution to pause between

// solutions.

private class PauseClass

{

public synchronized void pause()

{

paused = true;

try

{

wait();

}

catch (InterruptedException e)

{

System.out.println("Pause Problem");

}

}


public synchronized void unpause()

{

paused = false;

notify();

}

}


// Class to handle button

private class ButtonHandler implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

if (e.getSource() == runDemo)

{

if (!paused)

{

runDemo.setEnabled(false);

info.setText("Searching for Solutions");

runThread = new Thread(JRQueens.this);

runThread.start();

}

else

{

runDemo.setEnabled(false);

info.setText("Searching for Solutions");

pauser.unpause();

}

repaint();

}

}

}


// Inner class to represent a square on the board.

private class ChessSquare extends Rectangle2D.Double

{

private boolean occupied;


public ChessSquare(double x1, double y1, double wid, double hei)

{

super(x1, y1, wid, hei);

occupied = false;

}


public void draw(Graphics2D g2d)

{

g2d.draw(this);

int x = (int) this.getX();

int y = (int) this.getY();

int sz = (int) this.getWidth();

if (occupied)

{

g2d.setFont(new Font("Serif", Font.BOLD, 36));

g2d.drawString("Q", x+10, y+sz-10);

}

}


public void occupy()

{

occupied = true;

}


public void remove()

{

occupied = false;

}


public boolean isOccupied()

{

return occupied;

}

}


private class ShapePanel extends JPanel

{


private int prefwid, prefht;


public ShapePanel (int pwid, int pht)

{


prefwid = pwid;

prefht = pht;

}


public Dimension getPreferredSize()

{

return new Dimension(prefwid, prefht);

}


public void paintComponent (Graphics g)

{

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

for (int i = 0; i < 8; i++)

{

for (int j = 0; j < 8; j++)

{

(squares[i][j]).draw(g2d);

}

}

}

}


}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote