/*
Задача "Восемь ферзей", язык Java
Автор: Тимоти Бадд, университет штата Орегон, январь 1996
*/
import java.awt.*;
import java.applet.*;
class Queen
{
// поля данных
private int row;
private int column;
private Queen neighbor;
// конструктор
Queen (int c, Queen n)
{
// инициализировать поля данных
row = 1;
column = c;
neighbor = n;
}
public boolean findSolution ()
{
while (
(neighbor != null)
&& neighbor.canAttack(row, column)
)
if (! advance()) return false;
return true;
}
public boolean advance()
{
if (row < 8)
{
row++;
return findSolution();
}
if (neighbor != null)
{
if (! neighbor.advance ()) return false;
}
else return false;
row = 1;
return findSolution();
}
private boolean canAttack(int testRow, int testColumn)
{
int columnDifference = testColumn — column;
if(
(row == testRow)
||(row + columnDifference == testRow)
||(row — columnDifference == testRow)
)
return true;
if(neighbor != null)
return neighbor.canAttack(testRow, testColumn);
return false;
}
public void paint (Graphics g)
{
// сперва нарисуем соседа
if (neighbor != null) neighbor.paint(g);
// затем нарисуем себя
// x, y — это верхний левый угол
int x = (row — 1) * 50;
int y = (column — 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 class QueenSolver extends Applet
{
private Queen lastQueen;
public void init()
{
int i;
lastQueen = null;
for (i = 1; i <= 8; i++)
{
lastQueen = new Queen(i, lastQueen);
lastQueen.findSolution();
}
}
public void paint(Graphics g)
{
// нарисовать доску
for (int i = 0; i <= 8; i++)
{
g.drawLine(50 * i, 0, 50*i, 400);
g.drawLine(0, 50 * i, 400, 50*i);
}
// нарисовать ферзей
lastQueen.paint(g);
}
public boolean mouseDown(java.awt.Event evt, int x, int y)
{
lastQueen.advance();
repaint();
return true;
}
}
|