import java.applet.Applet;	// import Applet class
import java.awt.Graphics;	// import Graphics class

public class Queen {
    // instance variables
    private int row;
    private static int MAXROW;
    private int column;
    private Queen neighbor;
    private static final boolean SLOW=false;

    // constructor
    public Queen (int maxrow, int c, Queen n) {
	MAXROW = maxrow;
	row = 1;
	column = c;
	neighbor = n;
	}

    // private methods
    private boolean CanAttack (int r, int c) {
	int columnDifference = column - c;

	if (row == r ||
	    row + columnDifference == r ||
	    row - columnDifference == r)
	    return true;
	else return false;
	}

    private boolean AnyCanAttack (int r, int c) {
	if (CanAttack(r,c)) return true;
	else if (neighbor == null) return false;
	else return neighbor.AnyCanAttack (r,c);
	}

    private boolean PartialSolution () {
	if (neighbor == null) return true;
	else if (neighbor.AnyCanAttack (row, column)) return false;
	else return neighbor.PartialSolution ();
	}

    private boolean Advance () {
	if (row < MAXROW) {
	    row++;
	    return true;
	    }
	else if (neighbor == null)
	    return false;
	else {
	    row = 1;
	    if (SLOW)
		return neighbor.Advance ();
	    else
		return neighbor.FindNextSolution ();
	    }
	}

    private boolean FindSolution () {
	if (neighbor != null) neighbor.FindSolution ();

	while (! PartialSolution ()) {
	    if (! Advance ()) return false;
	    }
	return true;
	}



    private void paint (Graphics g) {
	int x = (column-1) * 50;
	int y = (row-1) * 50;

	g.drawLine (x+5,y+45,x+45,y+45);
	g.drawLine (x+5,y+45,x+5,y+5);
	g.drawLine (x+45,y+45,x+45,y+5);
	g.drawLine (x+5,y+35,x+45,y+35);
	g.drawLine (x+5,y+5,x+15,y+20);
	g.drawLine (x+15,y+20,x+25,y+5);
	g.drawLine (x+25,y+5,x+35,y+20);
	g.drawLine (x+35,y+20,x+45,y+5);
	g.drawOval (x+20,y+20,10,10);
    	}

    // public methods
    public boolean FindNextSolution () {
	do {
	    if (! Advance ()) return false;
	    } while (! PartialSolution ());
	return true;
	}

    public void paintAll (Graphics g) {
	if (neighbor != null) neighbor.paintAll (g);
	paint (g);
	}

    }
