CS 100: Lecture L22
April 15
import java.io.*;
import java.awt.*;
public class PointsInPlane extends Frame
{
public void paint(Graphics g)
{
g.fillRect(0,0,1000,1000);
int[] h0 = { 100, 450, 200, 300, 400, 650, 500, 850, 150, 150};
int[] v0 = { 400, 100, 250, 500, 350, 250, 100, 300, 200, 400};
double[][] D = distTable(h0,v0);
// ****************************************************************
int[] s = findPath(D,0);
showPath(g,h0,v0,s);
showCities(g,h0,v0);
// ****************************************************************
}
public static double[][] distTable(int[] h, int[] v)
// Yields an n-by-n array whose (i,j) entry is the distance from a city at (h[i],v[i]) to
// a city at (h[j],v[j]). Here n = h.length = v.length.
{
int n = h.length;
double[][] D = new double[n][n];
for(int i=0;i< n;i++)
// Record all the distances from the ith point. Exploit symmetry.
{
D[i][i] = 0;
for(int j=0;j< i;j++)
{
D[i][j] = Math.sqrt((h[i]-h[j])*(h[i]-h[j]) + (v[i]-v[j])*(v[i]-v[j]));
D[j][i] = D[i][j];
}
}
return D;
}
public static int[] findPath(double[][] D, int firstStop)
// Assume D is n-by-n array whose (i,j) entry represents the distance between
// city i and city j. firstStop must satisfy 0<=firstStop< n.
// Yields a length n array whose values are a permutation of 0,1,...,n-1.
// The ith component of the array represents the ith stop
// on a trip that starts at city firstStop and visits each city exactly once.
// The itinerary returned approximates, while not of guaranteed minimal length, tends to
// be close to optimal in that regard.
{
int n = D.length;
// A boolean array that keeps track of the cities visited...
boolean[] beenThere = new boolean[n];
for(int i=0;i< n;i++)
beenThere[i] = false;
beenThere[firstStop] = true;
// Get ready for the trip..
int[] city = new int[n]; // city[i] will be the index of the ith city visited.
int c = firstStop; // c is the index of the current city.
city[0] = c;
int k=0;
int nextStop;
double minDist;
for(int i=1;i<=n-1;i++)
// Find the i-th city to visit
{
// Find the first unvisited city.
k=0;
while(beenThere[k])
k++;
minDist = D[c][k];
nextStop = k;
// Now try to find a closer unvisited city.
while(k< n)
{
if(!beenThere[k] && D[c][k]< minDist)
{
minDist = D[c][k];
nextStop = k;
}
k++;
}
// nextStop = index of the closest unvisited city. Go there.
c = nextStop;
city[i] = c;
beenThere[c] = true;
}
return city;
}
public static void showPath(Graphics g, int[] h, int[] v, int p[])
// Let n be the length of h,v, and path. Connects the (h[i],[v[i]) in the order
// specified by p (with return to the starting point), i.e.,
//
// (h[p[0]],v[p[0]]), (h[p[1]],v[p[1]]),..., (h[p[n-1]],v[p[n-1]]), (h[p[0]],v[p[0]])
{
g.setColor(Color.red);
int a,b;
int n = h.length;
for (int i=0;i < n;i++)
{
a = p[i];
b = p[(i+1)%n];
g.drawLine(h[a],v[a],h[b],v[b]);
}
}
public static void showCities(Graphics g, int[] h, int[] v)
// Displays the points (h[0],v[0]),...,(h[n-1],v[n-1]) where n = h.length = v.length
{
int n = h.length;
int r = 8;
g.setFont(new Font("TimesRoman",Font.BOLD,14));
for(int i=0;i< n;i++)
{
g.setColor(Color.yellow);
g.fillOval(h[i]-r,v[i]-r,2*r,2*r);
g.setColor(Color.black);
g.drawString(String.valueOf(i),h[i]-r/2,v[i]+r/2);
}
}
}
public class L22
{
public static void main(String args[])
{
PointsInPlane d = new PointsInPlane();
d.resize(1000,800);
d.move(0,75);
d.setTitle("Shortest RoundTrip Problem");
d.show();
d.toFront();
}
}