Solution:
#include<iostream>
#include <stdio.h>
#include<math.h>
#include <iomanip>
using namespace std;
#define max_network_range 10
int NUM_OF_NETWORKS;
double MIN_WIRE_COST = 0.00;
struct NetworkDetails
{
int x;
int y;
}networksDetails[max_network_range], networkTaken[max_network_range];
int output[max_network_range];
int minOutPutPattern[max_network_range];
bool used[max_network_range];
void initUsed();
void permutation(int level,int taken);
void printPermutation();
void displayOutput(int TC);
double calculateDistance();
double calcDistBetnTwoPoint(int x1,int y1,int x2,int y2);
int main()
{
freopen("216.txt", "r", stdin);
std::cout << std::setprecision(2) << std::fixed;
NUM_OF_NETWORKS = 0;
int TC = 0;
while (cin >> NUM_OF_NETWORKS && NUM_OF_NETWORKS !=0)
{
for (int i = 0; i < NUM_OF_NETWORKS; i++)
{
cin >> networksDetails[i].x >> networksDetails[i].y;
}
initUsed();
MIN_WIRE_COST = 9999999.00;
permutation(0, NUM_OF_NETWORKS);
displayOutput(++TC);
}
return 0;
}
void permutation(int level, int taken)
{
if (level == taken)
{
double cost = calculateDistance();
if (MIN_WIRE_COST > cost)
{
MIN_WIRE_COST = cost;
for (int i = 0; i < NUM_OF_NETWORKS; i++)
{
minOutPutPattern[i] = output[i];
}
}
return;
}
for (int i = 0; i < NUM_OF_NETWORKS; i++)
{
if (!used[i])
{
used[i] = true;
output[level] = i;
permutation(level + 1,taken);
used[i] = false;
}
}
}
void displayOutput(int TC)
{
cout << "**********************************************************" << endl;
cout << "Network #" << TC << endl;
for (int i = 1; i < NUM_OF_NETWORKS; i++)
{
double res = 0.0;
res = calcDistBetnTwoPoint(networksDetails[minOutPutPattern[i - 1]].x, networksDetails[minOutPutPattern[i - 1]].y, networksDetails[minOutPutPattern[i]].x, networksDetails[minOutPutPattern[i]].y);
cout << "Cable requirement to connect (" << networksDetails[minOutPutPattern[i - 1]].x << "," << networksDetails[minOutPutPattern[i - 1]].y << ") to (" << networksDetails[minOutPutPattern[i]].x << "," << networksDetails[minOutPutPattern[i]].y << ") is " << res << " feet." << endl;
}
cout << "Number of feet of cable required is " << MIN_WIRE_COST << "." << endl;
}
double calculateDistance()
{
double distance = 0.00;
for (int i = 1; i <NUM_OF_NETWORKS; i++)
{
distance += calcDistBetnTwoPoint(networksDetails[output[i - 1]].x, networksDetails[output[i - 1]].y, networksDetails[output[i]].x, networksDetails[output[i]].y);
}
return distance;
}
double calcDistBetnTwoPoint(int x1, int y1, int x2, int y2)
{
double res = 0.0;
res = (16.0 + sqrt(pow((double)(abs(x1 - x2)), 2.0) + pow((double)(abs(y1 - y2)), 2.0)));
return res;
}
void initUsed()
{
for (int i = 0; i < max_network_range; i++)
{
used[i] = false;
output[i] = 0;
minOutPutPattern[i] = 0;
}
}
No comments:
Post a Comment
Thanks for your comments