题目地址
题目大意
就让你判断有没有两根线是相交的,如果有,就输出烧毁。
解题思路
两遍for循环暴力判断就行,一套两线段是否相交的板子就行。
AC代码
#include <iostream>
using namespace std;
struct point
{
double x, y;
};
struct py
{
point start, end;
void add(point s, point e)
{
start.x = s.x;
start.y = s.y;
end.x = e.x;
end.y = e.y;
}
};
py a[3000];
double mul(point a, point b, point c)
{
return (c.x-a.x)*(b.y-a.y) - (b.x-a.x)*(c.y-a.y);
}
bool slove(py a, py b)
{
if (
max(a.start.x, a.end.x) >= min(b.start.x, b.end.x)
&& max(b.start.x, b.end.x) >= min(a.start.x, a.end.x)
&& max(a.start.y, a.end.y) >= min(b.start.y, b.end.y)
&& max(b.start.y, b.end.y) >= min(a.start.y, a.end.y)
&& mul(b.start, a.end, b.start)*mul(a.end, b.end, a.start) >= 0
&& mul(a.start, b.end, b.start)*mul(b.end, a.end, b.start) >= 0
)
return true;
return false;
}
int main()
{
int n;
while (cin >> n)
{
bool flag = false;
for (int i=0; i<n; i++)
{
point a1, a2;
cin >> a1.x >> a1.y;
cin >> a2.x >> a2.y;
a[i].add(a1, a2);
}
for (int i=0; i<n; i++)
{
for (int j=0; j<i; j++)
{
if (i != j && slove(a[i], a[j]))
{
flag = true;
break;
}
}
if (flag)
break;
}
if (!flag)
cout << "ok!" << endl;
else
cout << "burned!" << endl;
}
return 0;
}