| ||||||||||
| 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