ZOJ 3226 Mobile Positioning

来源:互联网 发布:淘宝上的貂皮能买吗 编辑:程序博客网 时间:2024/06/06 01:30

Link To The Problem


Solution : 

Step 1 : 求出B点的坐标(注意时间可能为0)

Step 2 : 求出A点的坐标


PS:一定要注意所有可能的情况。。。极其猥琐。。。


Code : 

// ZOJ 3226 Mobile Positioning// Geometry & Math Calculate#include<cstdio>#include<math.h>#include<iostream>#include<algorithm>#include<cstring>using namespace std;#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)#define sf scanf#define pf printf#define dbg(x) cerr << __LINE__ << " : " << #x << " : " << (x) << endltypedef double D;D const eps = 1.0e-6;D const pi = acos(-1.0);// Data Struct :int inline dcmp(D x) {if(x>=-eps && x<=eps) return 0;return x > 0 ? 1 : -1;}D inline sqr(D x) { return x*x; }struct P {D x,y;P() {};P(D x,D y):x(x),y(y){};P operator + (P u) {return P(x+u.x,y+u.y);} P operator - (P u) {return P(x-u.x,y-u.y);}P operator * (D k) {return P(x*k, y*k);}P operator / (D k) {return P(x/k,y/k);}D operator * (P u) {return x*u.y-y*u.x;}D operator ^ (P u) {return x*u.x+y*u.y;}bool operator < (const P& u) const{ if(dcmp(x-u.x) == 0) return dcmp(y-u.y) < 0;return dcmp(x-u.x) < 0;}bool operator == (const P& u) {return dcmp(x-u.x)==0 && dcmp(y-u.y)==0;}void read() { sf("%lf%lf",&x,&y); }void out() { if(x<0 && -x < 0.005) x=0;if(y<0 && -y < 0.005) y=0;pf("%.2lf %.2lf\n",x,y);   }D len() { return sqrt(x*x+y*y); }P unit() { P ret(x,y);if(dcmp(ret.len())) ret=ret/ret.len();return ret;}P rotate(D s) { return P(x*cos(s) - y*sin(s), x*sin(s) + y*cos(s));}};struct C {P u;D r;C() {};C(P u,D r):u(u),r(r){};};int intersection(C a,C b,P& p1,P& p2) {if(dcmp(a.r)==0) {p1 = a.u;return 1;}if(dcmp(b.r)==0) {p1 = b.u;return 1;}D d = (a.u-b.u).len();if(dcmp(d)==0 && dcmp(a.r-b.r)==0) return -1;if(dcmp(d-(a.r+b.r))>0) return 0;if(dcmp(d-fabs(a.r-b.r))<0) return 0;P dir = b.u-a.u;D s = acos((sqr(dir.len())+sqr(a.r)-sqr(b.r))/2.0/a.r/dir.len());dir = dir.unit();p1 = dir.rotate(s)*a.r + a.u;p2 = dir.rotate(-s)*a.r + a.u;if(p1 == p2) return 1;return 2;}// Soulution Part:D t1,t2,t3,t4,v;P B[2];P P1,P2;P ans[10];int vis[10];void work(){int num = 0;C c1(P1,t2*v),c2(P2,t3*v);if(dcmp(t1+t2)==0) {pf("1\n");P1.out();return ;}if(dcmp(t3+t4)==0) {pf("-1\n");return ;}D t = (t3+t4)/(t1+t2);int k = intersection(c1,c2,B[0],B[1]);if(k==-1) {pf("-1\n");return ;}for(int i=0;i<k;i++) {c1 = C(P1,t1*v);c2 = C(B[i]*((1+t)/t)-P2/t,t4*v/t);int k1=intersection(c1,c2,ans[num],ans[num+1]);//dbg(k1);if(k1==-1) {pf("-1\n");return ;}num += k1;}memset(vis,0,sizeof(vis));int cnt = 0;P tmp[10];for(int i=0;i<num;i++) if(!vis[i]){for(int j=i+1;j<num;j++) if(ans[i]==ans[j]){vis[j]=1;}tmp[cnt++]=ans[i];}sort(tmp,tmp+cnt);pf("%d\n",cnt);for(int i=0;i<cnt;i++) tmp[i].out();}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifwhile(~sf("%lf%lf",&P1.x,&P1.y)){P2.read();sf("%lf%lf%lf%lf%lf",&t1,&t2,&t3,&t4,&v);work();}return 0;}