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 |
Re:我有一个猜想,不知道对不对In Reply To:我有一个猜想,不知道对不对 Posted by:animate at 2005-08-06 14:30:19 > 如果(x,y)出发指向(X,Y)的射线是(x,y)8个方向中的一个,那么直接按这个方向走就可以了。 > 否则,只需要一个中转站,即最多只需要2条指令。对于起点为(x,y)指向(X,Y)的射线,考虑顺时针方向和逆时针方向最靠近它的2条方向射线,设为L1,L2;对于起点为(X,Y)指向(x,y)的射线,考虑顺时针方向和逆时针方向最靠近它的2条方向射线,设为L3,L4;计算L1和L3,L2和L4的交点,交点就是中转站。然后选择总距离较短的那个中转站。如果该中转站在圆外,就取另一个中转站。 我也这样猜想,下面是我的代码,老师wa,求测试数据!!!!!!! 各位牛人帮忙看看为什么哇吧!!!!!!! #include <stdio.h> #include <math.h> double e = 1e-11; double pi = acos(-1.0); struct dot { double x; double y; }; dot dd[8]; char* direction[8] = {"north", "northeast", "east", "southeast", "south", "southwest", "west", "northwest"}; int map[3][3]; void Intitial() { map[1][2] = 0; map[2][2] = 1; map[2][1] = 2; map[2][0] = 3; map[1][0] = 4; map[0][0] = 5; map[0][1] = 6; map[0][2] = 7; } inline int M(double d) { if(fabs(d) < e) //等于0 return 0; if(d > e) return 1; //大于0 return -1; //小于0 } inline double Dist(dot d1, dot d2) { return sqrt(pow(d2.x - d1.x, 2.0) + pow(d2.y - d1.y, 2.0)); } void Ans(dot d1, dot d2, double R) { int d; if(d1.x == d2.x || d1.y == d2.y) { d = map[M(d2.x - d1.x) + 1][M(d2.y - d1.y) + 1]; printf("%s %.10lf\n\n", direction[d], Dist(d1, d2)); return ; } //找中介点 dd[0].y = dd[1].y = d1.y; dd[0].x = d2.y - d1.y + d2.x; dd[1].x = d2.x - d2.y + d1.y; dd[2].x = dd[3].x = d1.x; dd[2].y = d1.x - d2.x + d2.y; dd[3].y = d2.y + d2.x - d1.x; dd[4].y = dd[5].y = d2.y; dd[4].x = d1.y - d2.y + d1.x; dd[5].x = d1.x - d1.y + d2.y; dd[6].x = dd[7].x = d2.x; dd[6].y = d2.x - d1.x + d1.y; dd[7].y = d1.y + d1.x - d2.x; int k = -1; dot zero; zero.x = zero.y = 0; int i; for(i = 0; i < 8; i++) if(M(dd[i].x * dd[i].x + dd[i].y * dd[i].y - R * R) <= 0) { if(k == -1) k = i; else if(Dist(dd[i], d1) + Dist(dd[i], d2) < Dist(dd[k], d1) + Dist(dd[k], d2)) k = i; } d = map[M(dd[k].x - d1.x) + 1][M(dd[k].y - d1.y) + 1]; //printf("d: %d\n", d); printf("%s %.10lf\n", direction[d], Dist(dd[k], d1)); if(M(dd[k].x - d2.x) == 0 && M(dd[k].y - d2.y) == 0) printf("\n"); else { d = map[M(d2.x - dd[k].x) + 1][M(d2.y - dd[k].y) + 1]; //printf("d: %d\n", d); printf("%s %.10lf\n\n", direction[d], Dist(dd[k], d2)); } } int main() { double r; dot d1, d2; Intitial(); while(scanf("%lf", &r) != EOF) { if(r == -1) break; scanf("%lf%lf%lf%lf", &d1.x, &d1.y, &d2.x, &d2.y); Ans(d1, d2, r); } return 0; } /* 10 -2 8 -6 7.9888 10 -6 7.9888 -2 8 */ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator