Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:我有一个猜想,不知道对不对

Posted by lianzhouxiaowu at 2009-11-15 22:53:43 on Problem 1851
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator