| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
莫名其妙的WA,莫名其妙的AC……交的是POJ3335、1474、1279的模板,应该没有错了……
第1次WA后,在网上搜,结果以为将zero = 1e-8改成zero = 1e-10就过了,可是还是WA……
第2次WA后,以为顶点顺序可能是逆时针,有改了改,还是WA……
第3次WA后,没信心了,把第1次交的代码随便看看,乱改改,再试试,就AC了……
无语……
最后一次的代码如下,纪念一下:
#include<cstdio>
using namespace std;
const int maxn = 3005;
const double zero = 1e-8;
struct Tpoint{
double x, y;
};
struct Tpgn{
int n; Tpoint ps[maxn];
} Pts, Ret;
int T; double ans;
void init()
{
scanf("%d", &Pts.n);
for (int i = 0; i < Pts.n; i++) scanf("%lf%lf", &Pts.ps[i].x, &Pts.ps[i].y);
Pts.ps[Pts.n] = Pts.ps[0];
}
inline double Fabs(double x)
{
return x > 0 ? x : -x;
}
inline double cross(Tpoint p0, Tpoint p1, Tpoint p2)
{
return (p1.x - p0.x) * (p2.y - p0.y) - (p1.y - p0.y) * (p2.x - p0.x);
}
inline bool same(Tpoint p0, Tpoint p1)
{
return Fabs(p1.x - p0.x) < zero && Fabs(p1.y - p0.y) < zero;
}
inline Tpoint get_point(double a1, double b1, double c1, double a2, double b2, double c2)
{
Tpoint ret; ret.y = (c2 * a1 - c1 * a2) / (b1 * a2 - b2 * a1);
if (Fabs(a2) < zero) ret.x = -(b1 * ret.y + c1) / a1;
else ret.x = -(b2 * ret.y + c2) / a2;
return ret;
}
inline void get_line(Tpoint p0, Tpoint p1, double &a, double &b, double &c)
{
a = p1.y - p0.y; b = p0.x - p1.x;
c = -(a * p0.x + b * p0.y);
}
Tpgn calc(Tpoint p0, Tpoint p1, Tpgn Now)
{
Tpgn ret; int i, j; double t1, t2;
double a1, b1, c1, a2, b2, c2; Tpoint tmp;
get_line(p0, p1, a1, b1, c1);
ret.n = 0;
for (i = 0; i < Now.n; i++){
j = i + 1;
t1 = cross(p0, p1, Now.ps[i]);
t2 = cross(p0, p1, Now.ps[j]);
if (t1 < zero && t2 < zero){
ret.ps[ret.n++] = Now.ps[i];
ret.ps[ret.n++] = Now.ps[j];
}
else if (t1 > zero && t2 > zero) continue;
else {
get_line(Now.ps[i], Now.ps[j], a2, b2, c2);
tmp = get_point(a1, b1, c1, a2, b2, c2);
if (t1 < zero){
ret.ps[ret.n++] = Now.ps[i];
ret.ps[ret.n++] = tmp;
} else {
ret.ps[ret.n++] = tmp;
ret.ps[ret.n++] = Now.ps[j];
}
}
}
if (ret.n == 0) return ret;
for (i = 1, j = 1; i < ret.n; i++)
if (!same(ret.ps[i], ret.ps[i-1]))
ret.ps[j++] = ret.ps[i];
ret.n = j;
if (j > 1 && same(ret.ps[0], ret.ps[j-1])) ret.n--;
ret.ps[ret.n] = ret.ps[0];
return ret;
}
void work()
{
Ret = Pts;
for (int i = 0; i < Pts.n; i++)
Ret = calc(Pts.ps[i], Pts.ps[i+1], Ret);
ans = 0;
Tpoint p0; p0.x = 0; p0.y = 0;
for (int i = 0; i < Ret.n; i++)
ans += cross(p0, Ret.ps[i], Ret.ps[i+1]);
ans /= 2; ans = Fabs(ans);
}
void print()
{
printf("%.2f\n", ans);
}
int main()
{
scanf("%d", &T);
while (T){
T--;
init();
work();
print();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator