HDU 4617 Weapon (计算几何:异面直线距离)

来源:互联网 发布:淘宝下载安装到桌面 编辑:程序博客网 时间:2024/05/13 17:06

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4617


题意:给出空间内的n个圆的圆心及圆上两点,即n个无限延长的光柱的截面,问这些圆柱是否会交在一起,如果不交输出最短距离,否则输出"Lucky"


思路:对于每个圆,找出其法向量直线,这样每两条法向量直线的间距减去两圆的半径和即是距离,判断该距离是否<=0即可


#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <utility>#include <functional>#include <vector>#include <queue>#include <string>#include <set>#include <map>#pragma comment (linker, "/STACK:1024000000,1024000000")#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1#define eps 1e-8#define sign(x) ((x) > eps ? 1 : ((x) < -eps ? (-1) : (0)))using namespace std;typedef long long ll;int n;struct point{    double x, y, z;    point() {}    point(double _x, double _y, double _z)    {        x = _x;        y = _y;        z = _z;    }    void input()    {        scanf("%lf%lf%lf", &x, &y, &z);    }    point operator + (const point &b) const    {        return point(x + b.x, y + b.y, z + b.z);    }};struct line{    point a, b;};struct circle{    point o, p1, p2;    void input()    {        o.input();        p1.input();        p2.input();    }} c[100];point xmult(point u, point v){    point ret;    ret.x = u.y * v.z - v.y * u.z;    ret.y = u.z * v.x - u.x * v.z;    ret.z = u.x * v.y - u.y * v.x;    return ret;}double dis(point u, point v){    return sqrt((u.x - v.x) * (u.x - v.x) + (u.y - v.y) * (u.y - v.y) + (u.z - v.z) * (u.z - v.z));}double dmult(point u, point v){    return u.x * v.x + u.y * v.y + u.z * v.z;}point sub(point u, point v){    point ret;    ret.x = u.x - v.x;    ret.y = u.y - v.y;    ret.z = u.z - v.z;    return ret;}double vlen(point p){    return sqrt(p.x * p.x + p.y * p.y + p.z * p.z);}point pvec(circle s){    return xmult(sub(s.o, s.p1), sub(s.p1, s.p2));}double linedis(line u, line v){    point n = xmult(sub(u.a, u.b), sub(v.a, v.b));    return fabs(dmult(sub(u.a, v.a), n)) / vlen(n);}void solve(){    double ans = 1e9;    for(int i = 0; i < n; i++)    {        for(int j = i + 1; j < n; j++)        {            circle c1 = c[i], c2 = c[j];            double r1 = dis(c[i].o, c[i].p1);            double r2 = dis(c[j].o, c[j].p1);            point k1 = pvec(c1);            point k2 = pvec(c2);            line l1, l2;            l1.a = c1.o, l1.b = k1 + c1.o;            l2.a = c2.o, l2.b = k2 + c2.o;            double d = linedis(l1, l2);            if(sign(d - r1 - r2) <= 0)            {                puts("Lucky");                return ;            }            ans = min(ans, d - r1 - r2);        }    }    printf("%.2f\n", ans);}int main(){    int t;    scanf("%d", &t);    while(t--)    {        scanf("%d", &n);        for(int i = 0; i < n; i++)            c[i].input();        solve();    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁宝宝爱咬人怎么办 孩子上学老打人怎么办 孩子上学爱说话怎么办 孩子抢玩具打人怎么办 生气就像打人怎么办 小孩总喜欢打人怎么办 小孩性格好翘怎么办 一岁小宝宝打人怎么办 小孩子老喜欢打人怎么办 孩子被大人欺负怎么办 小孩识字量少怎么办 父母打架孩子该怎么办 小孩嘴唇里面烂怎么办 幼儿园小朋友很调皮怎么办 幼儿园小朋友上课调皮怎么办 孩子误冲游戏怎么办 遇到别的熊孩子怎么办 幼儿园遇到熊孩子怎么办 高铁上遇到熊孩子怎么办 幼儿爱打人家长怎么办 妈妈爱打孩子怎么办 35儿童爱打人怎么办? 一岁半宝宝太调皮怎么办 儿子高一不听话怎么办 小孩说了不听话怎么办 我的妈妈文盲怎么办 电脑键盘反拼音怎么办 小孩学习态度差怎么办 孩子不好好上学怎么办 小孩读书态度不好怎么办 幼儿园孩子不认识数字怎么办 一年级孩子拼音很差怎么办 孩子的拼音不好怎么办 小孩不会拼拼音怎么办 小孩拼音学不会怎么办 儿童l发音不准怎么办 小孩发音不标准怎么办 拼音l发音不准怎么办 孩子拼音声调分不清怎么办 小孩gk读成dt怎么办 拼音音调学不会怎么办