hdu 4741 Save Labman No.004

来源:互联网 发布:mac电脑铃声剪辑软件 编辑:程序博客网 时间:2024/06/05 12:50

题目:hdu 4741 Save Labman No.004

思路:异面直线公垂线。 click_here


#include <cstring>#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <vector>using namespace std;double H,I,J,K,L,M,N,O,P,Q;struct point{    double x,y,z;}p[4],q[4];double sq(double tmp){    return tmp*tmp;}vector<double>v;vector<double> solve(point p[]){    v.clear();    H = p[1].x-p[0].x;    I = p[1].y-p[0].y;    J = p[1].z-p[0].z;    K = p[3].x-p[2].x;    L = p[3].y-p[2].y;    M = p[3].z-p[2].z;    N = H*I*L - I*I*K - J*J*K + H*J*M ;    O = H*H*L - H*I*K - I*J*M + J*J*L ;    P = H*J*K - H*H*M - I*I*M + I*J*L ;    Q = -p[0].x*N + p[0].y*O - p[0].z*P ;    double k = O*p[2].y - N*p[2].x - P*p[2].z - Q ,x,y,z;    k /= (N*K - O*L + P*M);    x=K*k+p[2].x;    y=L*k+p[2].y;    z=M*k+p[2].z;    v.push_back(x);    v.push_back(y);    v.push_back(z);    return v;}double dis(vector<double>v1,vector<double>v2){    double tmp=0;    for(int i=0;i<v1.size();i++)        tmp+=sq(v1[i]-v2[i]);    return sqrt(tmp);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        for(int i=0;i<4;i++)        {            scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);            q[3-i].x=p[i].x;            q[3-i].y=p[i].y;            q[3-i].z=p[i].z;        }        vector<double>v1=solve(p),v2=solve(q);        printf("%.6lf\n",dis(v1,v2));        for(int i=0;i<v2.size();i++)            printf("%.6lf ",v2[i]);        for(int i=0;i<v1.size()-1;i++)            printf("%.6lf ",v1[i]);        printf("%.6lf\n",v1[v1.size()-1]);    }    return 0;}


原创粉丝点击