/**************************************************************************
Test driver for Problem 4 of HW6, CSE310 Fall 2003
Written by: Clay Stevens, some code modified from code by Chris Bourke
***************************************************************************/
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
struct City {
int x;
int y;
int visitCount;
};
int main(int argc, char **argv) {
int numCities;
City* myCities;
// Command and file checking
if(argc != 3) {
cout << "Usage: P4Verify <datafile> <outputfile>\n" << endl;
return -1;
}
ifstream data;
ifstream sOutput;
data.open(argv[1]);
sOutput.open(argv[2]);
if(data.fail() || sOutput.fail())
{
cerr << "File error: Failed to open one or both of the files " << endl;
return -1;
}
//read in datafile
//FORMAT: Line 1 = number of pairs
//Each line after: x y coordinates
data >> numCities;
myCities = new City[numCities];
for(int i = 0; i < numCities; i++)
{
data >> myCities[i].x;
data >> myCities[i].y;
myCities[i].visitCount = 0;
}
data.close();
double totalCost = 0;
double claimedCost;
int first;
int To;
int From;
//Read in outputfile
// Expects first line to be claimed total cost
// then list of cities in order to visit
sOutput >> claimedCost;
sOutput >> To; // read in first city
first=To;
To--; // decrement To to refer to an index
for(int i = 1; i <= numCities; i++)
{
myCities[To].visitCount++;
From = To+1; //previous destination set to current source
// This is a quick hack to make sure we get the last edge...
if(i==numCities)
To=first;
else
sOutput >> To; //read new destination
From--;
To--;
totalCost = totalCost + sqrt( (float)
(myCities[From].x- myCities[To].x)*(myCities[From].x - myCities[To].x) +
(myCities[From].y - myCities[To].y)*(myCities[From].y - myCities[To].y));
}
int extras = 0;
while(!sOutput.eof())
{
sOutput >> extras;
if(extras > 0){
extras--;
myCities[extras].visitCount++;
}
}
sOutput.close();
cout << "Results: " << endl;
cout << "==================================" << endl;
cout << "Claimed Cost: " << claimedCost << endl;
cout << "Calculated Cost: " << totalCost << endl;
int multiVisit = 0;
int notVisit = 0;
for (int j = 0; j < numCities; j++){
if (myCities[j].visitCount > 1){
multiVisit++;
}
if (myCities[j].visitCount == 0) {
notVisit++;
cout<<"Not visited: "<<j<<"\n";
}
}
cout << "# Cities Visited More Than Once: " << multiVisit << endl;
cout << "# Cities Not Visited At All: " << notVisit << endl;
return 1;
}