import java.awt.*;
import objectdraw.*;
// Controller for a path finder.
// Andrea Danyluk, March 2002.
public class Paths extends WindowController
{
// the grid-specific path finder
private PathFinder grid;
// the message indicating number of paths found
private Text pathsMessage;
// number of rows and columns in the grid
private static final int ROWS = 5;
private static final int COLS = 5;
// row and column of the start location
private static final int X_START = 2;
private static final int Y_START = 4;
// row and column of the end location
private static final int X_END = 5;
private static final int Y_END = 1;
// dot size and spacing
private static final int DOT_SIZE = 5;
private static final int DOT_SPACING = 20;
// location of grid graphic
private static final Location GRID_LOCATION = new Location(10, 10);
public void begin()
{
grid = new PathFinder(GRID_LOCATION, ROWS, COLS, DOT_SIZE, DOT_SPACING, canvas);
pathsMessage = new Text("", GRID_LOCATION.getX(),
GRID_LOCATION.getY()+ROWS*DOT_SPACING, canvas);
}
// count the number of paths from a specified start point to a
// specified end point
public void onMouseClick(Location point)
{
int numPaths = grid.allPaths(X_START, Y_START, X_END, Y_END);
pathsMessage.setText(numPaths);
}
// clear the path finder
public void onMouseExit(Location point)
{
grid.clear();
pathsMessage = new Text("", GRID_LOCATION.getX(),
GRID_LOCATION.getY()+ROWS*DOT_SPACING, canvas);
}
}
import java.awt.*;
import objectdraw.*;
// A recursive path counter
// Andrea Danyluk, March 2002
// Sets up a grid of points and finds the number of paths from a specified
// start point to a specified end point. All path searching is done up and to
// the right.
public class PathFinder
{
// the location of the grid graphic
private Location point;
// the size and spacing of the grid dots
private int dotSize, dotSpacing;
// the number of rows and columns in the grid
private int numRows, numCols;
// the canvas
private DrawingCanvas canvas;
public PathFinder(Location point, int numRows, int numCols,
int dotSize, int dotSpacing, DrawingCanvas canvas)
{
// remember instance variable values
this.point = point;
this.dotSpacing = dotSpacing;
this.dotSize = dotSize;
this.numRows = numRows;
this.numCols = numCols;
this.canvas = canvas;
// draw the grid
drawGrid();
}
// count all paths from start point to end point, highlight start
// points
public int allPaths(int xStart, int yStart, int xEnd, int yEnd)
{
// first highlight the start and end points
new FilledOval(point.getX()+(xStart-1)*dotSpacing,
point.getY()+(yStart-1)*dotSpacing,
dotSize, dotSize, canvas).setColor(Color.green);
new FilledOval(point.getX()+(xEnd-1)*dotSpacing,
point.getY()+(yEnd-1)*dotSpacing,
dotSize, dotSize, canvas).setColor(Color.red);
int xPaths = 0;
int yPaths = 0;
// if the start point is the same as the end point, there's
// only one path.
if (xStart == xEnd && yStart == yEnd)
return 1;
// find out how many paths there are from the neighbor to the
// right of the start point
if (xStart < xEnd)
xPaths = allPaths(xStart+1, yStart, xEnd, yEnd);
// find out how many paths there are from the neighbor above
if (yStart > yEnd)
yPaths = allPaths(xStart, yStart-1, xEnd, yEnd);
// add up the paths from each neighbor and return
return xPaths + yPaths;
}
public void clear()
{
// clear the canvas
canvas.clear();
// draw a new grid
drawGrid();
}
// draw a new grid
private void drawGrid()
{
int xCounter = 1;
int yCounter = 1;
while (xCounter <= numCols)
{
while (yCounter <= numRows)
{
new FilledOval(point.getX()+(xCounter-1)*dotSpacing,
point.getY()+(yCounter-1)*dotSpacing, dotSize, dotSize, canvas);
yCounter = yCounter + 1;
}
yCounter = 1;
xCounter = xCounter + 1;
}
}
}