Ranking (as of 2013-05-25): 92 out of 909
Language: C++
/*
UVa 184 - Laser Lines
To build using Visual Studio 2008:
cl -EHsc -O2 UVa_184_Laser_Lines.cpp
*/
#include <iostream>
#include <iomanip>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
struct point {
int x, y;
bool operator<(const point& p) const;
};
bool point::operator<(const point& p) const
{
if (x < p.x)
return true;
else if (x > p.x)
return false;
else
return y < p.y;
}
bool collinear(const point& p1, const point& p2, const point& p3)
{
return (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x) == 0;
}
int main()
{
while (true) {
point p;
cin >> p.x >> p.y;
if (!p.x && !p.y)
break;
vector<point> points;
points.push_back(p);
while (true) {
cin >> p.x >> p.y;
if (!p.x && !p.y)
break;
points.push_back(p);
}
sort(points.begin(), points.end());
bool found = false;
size_t nr_points = points.size();
vector< pair<size_t, size_t> > lines;
// pair of indices that form 'longer' lines
for (size_t i = 0; i < nr_points - 2; i++)
for (size_t j = i + 1; j < nr_points - 1; j++) {
int nr_found = 0;
for (size_t k = 0; k < lines.size(); k++)
if (collinear(points[lines[k].first], points[lines[k].second], points[i]) &&
collinear(points[lines[k].first], points[lines[k].second], points[j])) {
nr_found = -1; break;
}
if (nr_found == -1)
continue;
for (size_t k = j + 1; k < nr_points; k++) {
if (collinear(points[i], points[j], points[k])) {
if (!found) {
found = true;
cout << "The following lines were found:\n";
}
if (!nr_found)
cout << setfill(' ') << '(' <<
setw(4) << points[i].x << ',' <<
setw(4) << points[i].y << ')' <<
'(' << setw(4) << points[j].x << ',' <<
setw(4) << points[j].y << ')';
cout << '(' << setw(4) << points[k].x <<
',' << setw(4) << points[k].y << ')';
nr_found++;
}
}
if (nr_found) {
cout << endl;
if (nr_found > 1)
lines.push_back(make_pair(i, j));
}
}
if (!found)
cout <<"No lines were found\n";
}
return 0;
}
No comments:
Post a Comment