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

我的程序如下,谁帮我看看那个bt数据过不去 谢谢了

Posted by first at 2006-12-18 11:25:39 on Problem 2913
In Reply To:数据太bt了 Posted by:first at 2006-12-18 10:26:11
#include <iostream>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <functional>
#include <cmath>
#include <iomanip>
#include <set>
#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

long double line1[2][3];
long double line2[2][3];
long double xyz[3];
long double d;
long double start[3];
long double end[3];
long double AB;
#define eps 1e-10

long double distance(long double *p1, long double *p2)
{
    return sqrt(pow(p1[0] - p2[0], 2) + pow(p1[1] - p2[1], 2) + pow(p1[2] - p2[2], 2));
}
long double jumpdis(long double *p)
{
	long double PA = distance(p, line2[0]);
	long double PB = distance(p, line2[1]);
    if(PA*PA < PB*PB + AB*AB && PB*PB < PA*PA + AB*AB)
	{
	   long double l = (PA + PB + AB)/2;
	   long double S = sqrt(abs((l - PA)*(l - PB)*(l - AB)*l));
	   return 2*S/AB;
	}
	return min(PA, PB);
}

void input()
{  
	scanf("%lf %lf %lf", &line1[0][0], &line1[0][1], &line1[0][2]);
	scanf("%lf %lf %lf", &line1[1][0], &line1[1][1], &line1[1][2]);
	scanf("%lf %lf %lf", &line2[0][0], &line2[0][1], &line2[0][2]);
	scanf("%lf %lf %lf", &line2[1][0], &line2[1][1], &line2[1][2]);
	scanf("%lf %lf %lf", &xyz[0], &xyz[1], &xyz[2]);
	scanf("%lf", &d);
}

long double solve()
{
	long double len1 = distance(line1[0], line1[1]);
	long double dir[3];
	dir[0] = (line1[0][0] - line1[1][0])/len1;
	dir[1] = (line1[0][1] - line1[1][1])/len1;
	dir[2] = (line1[0][2] - line1[1][2])/len1;
	bool flag1 = false, flag2 = false;
	int i;
	for(i = 0; i < 3; i ++)
	{
		start[i] = xyz[i] + d*dir[i];
		if(dir[i]*(line1[0][i] - start[i]) < 0) 
			flag1 = true;
		end[i] = xyz[i] - d*dir[i];
	    if(dir[i]*(line1[1][i] - end[i]) > 0) 
			flag2 = true;
	}
	if(flag1)
	{
		for(i = 0; i < 3; i ++)
			start[i] = line1[0][i];
	}
	if(flag2)
	{
		for(i = 0; i < 3; i ++)
			end[i] = line1[1][i];
	}
	AB = distance(line2[0], line2[1]);
	long double l = 0, r = 1;
	long double m1[3], m2[3];
	long double mr1, mr2;
	while(r - l > eps)
	{		
		mr1 = (2*l + r)/3.0;
		mr2 = (l + 2*r)/3.0;
		for(i = 0; i < 3; i ++)
		{
			m1[i] = (1 - mr1)*start[i] + mr1*end[i];
			m2[i] = (1 - mr2)*start[i] + mr2*end[i];
		}
		if(jumpdis(m1) < jumpdis(m2))
		{
             r = mr2;
		}
		else
		{
		     l =  mr1;
		}
	}
	mr1 = (l + r)/2;
	for(i = 0; i < 3; i ++)
	{
			m1[i] = (1 - mr1)*start[i] + mr1*end[i];
	}
    return jumpdis(m1);
}
int main()
{
     input();
	 printf("%.3lf\n", solve());	
	 return 0;	 
}
 




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