HDU 4617Weapon(两条异面直线的距离)
Weapon
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 270 Accepted Submission(s): 212
3
0 0 0
1 0 0
0 0 1
5 2 2
5 3 2
5 2 3
10 22 -2
11 22 -1
11 22 -3
3
0 0 0
1 0 1.5
1 0 -1.5
112 115 109
114 112 110
109 114 111
-110 -121 -130
-115 -129 -140
-104 -114 -119.801961
3
0 0 0
1 0 1.5
1 0 -1.5
112 115 109
114 112 110
109 114 111
-110 -121 -130
-120 -137 -150
-98 -107 -109.603922
2.32
Lucky
题目大意:当时LOR做出来了之后,我就看了一下,题目在二十分钟之内读懂了。但是想复杂了,没有直接转换思路。题目给你很多无限延伸的圆柱,问你有没有相交的,有的话输出Lucky没有的话输出还差的最小距离。
求两条异面直线的距离
若向量a=(a1,b1,c1),向量b=(a2,b2,c2), 则
向量a·向量b=a1a2+b1b2+c1c2
向量a×向量b=(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1)
(i、j、k分别为空间中相互垂直的三条坐标轴的单位向量)。
不过这个题目还debug了一下。因为两个向量
点乘的时候可能是负的,夹角大于90度的时候。所以需要转化为正。具体见代码。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; struct mq
{
double x; //x,y,z表示垂直于圆表面的向量
double y;
double z;
double a; //a,b,c圆心的坐标
double b;
double c;
double r; //r圆的半径
};
mq node[42]; double solve(mq p1,mq p2)
{
double a1,b1,c1,a2,b2,c2;
double s1,s2,s3; //s向量
double q1,q2,q3;
double ans1,ans2,ans;
a1=p1.x,b1=p1.y,c1=p1.z;
a2=p2.x,b2=p2.y,c2=p2.z;
s1=b1*c2-b2*c1,s2=c1*a2-c2*a1;
s3=a1*b2-a2*b1;
q1=p2.a-p1.a,q2=p2.b-p1.b;
q3=p2.c-p1.c;
ans1=fabs(q1*s1+q2*s2+q3*s3);
ans2=sqrt(s1*s1+s2*s2+s3*s3);
ans=ans1/ans2;
return ans;
} int main()
{
int tes,n,i,j;
double x1,y1,z1,x2,y2,z2,x3,y3,z3;
double a1,b1,c1,a2,b2,c2;
scanf("%d",&tes);
while(tes--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&z1,&x2,&y2,&z2,&x3,&y3,&z3);
node[i].a=x1,node[i].b=y1,node[i].c=z1,
a1=x2-x1,b1=y2-y1,c1=z2-z1;
a2=x3-x1,b2=y3-y1,c2=z3-z1;
node[i].r=sqrt(a1*a1+b1*b1+c1*c1); //半径
node[i].x=b1*c2-b2*c1,node[i].y=c1*a2-c2*a1;
node[i].z=a1*b2-a2*b1;
} int flag=0;
double res=10000000;
double tmp;
//tmp=solve(node[0],node[1]);
//printf("%.2f\n",tmp);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
tmp=solve(node[i],node[j]); //tmp返回的是两条中间的线的距离
tmp=tmp-node[i].r-node[j].r;
if(tmp<=0)
{
flag=1;
break;
}
if(tmp<res)
res=tmp;
}
if(flag)
break;
}
if(flag) puts("Lucky");
else printf("%.2f\n",res); }
return 0;
}
HDU 4617Weapon(两条异面直线的距离)的更多相关文章
- C# 判断两条直线距离
本文告诉大家获得两条一般式直线距离 一般式的意思就是 Ax+By+C=0" role="presentation">Ax+By+C=0Ax+By+C=0 如果有两个 ...
- 2018-7-31-C#-判断两条直线距离
title author date CreateTime categories C# 判断两条直线距离 lindexi 2018-07-31 14:38:13 +0800 2018-05-08 10: ...
- hdu 4617 Weapon【异面直线距离——基础三维几何】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4617 Weapon Time Limit: 3000/1000 MS (Java/Others) ...
- 求空间内两条直线的最近距离以及最近点的坐标(C++)
关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...
- 两条直线(蓝桥杯)二分枚举+RMQ
算法提高 两条直线 时间限制:1.0s 内存限制:256.0MB 问题描述 给定平面上n个点. 求两条直线,这两条直线互相垂直,而且它们与x轴的夹角为45度,并且n个点中离这两条 ...
- 旋转卡壳求两个凸包最近距离poj3608
#include <iostream> #include <cmath> #include <vector> #include <string.h> # ...
- 笔试算法题(19):判断两条单向链表的公共节点 & 字符集删除函数
出题:给定两个单向链表的头结点,判断其是否有公共节点并确定第一个公共节点的索引: 分析: 由于是单向链表,所以每个节点有且仅有一个后续节点,所以只可能是Y型交叉(每条链表中的某个节点同时指向一个公共节 ...
- 在3D中两条射线的相交性检测
摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\ ...
- 给定数轴上的n个点,求距离最近的两个点的距离
public class MinimumSpacing { //给定平面上的n个点,求距离最近的两个点的距离. //无从下手的话,先分解问题,分解成简单的,逐个分析,然后再合在一起考虑 //这是个2维 ...
随机推荐
- How to access the properties of an object in Javascript
Javascript has three different kinds of properties: named data property, named accessor property and ...
- [uva 11762]Race to 1[概率DP]
引用自:http://hi.baidu.com/aekdycoin/item/be20a91bb6cc3213e3f986d3,有改动 题意: 已知D, 每次从[1,D] 内的所有素数中选择一个Ni, ...
- HDU 1104 Remainder( BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- nyoj-709-异形卵(水题)
异 形 卵 时间限制:1000 ms | 内存限制:65535 KB 难度: 描写叙述 我们探索宇宙,是想了解浩瀚星空的奥妙.但我们却非常少意识到宇宙深处藏匿的危急,它们无时无刻不紧盯着我们的地球 ...
- Android 中文API (66) —— BluetoothClass.Device
前言 本章内容是android.bluetooth.BluetoothClass.Device,为Android蓝牙部分的章节翻译,版本为Android 2.3 r1,翻译来自中山大学的" ...
- innerText和innerHTML的区别
innerhtml用法 innertext用法 以及innerHTML与innertext的区别,看完这个大家以后在实际应用中,就可以选择合适的方法.尽可能的考虑到兼容性. test.innerHTM ...
- Sql缓存依赖--数据库缓存
•依赖于文件内容CacheDependency cDep = new CacheDependency(filePath); •依赖于数据库内容(轮询机制/通知机制)一:轮询机制 1.在数据库新建版本表 ...
- JavaScript编程风格--基本的格式化
缩进层级 推荐4个空格字符作为一个缩进层级. 语句结尾 推荐不要省略分号. 行的长度 最好一行不超过80个字符. 换行 在运算符后换行,下一行增加两个层级的缩进. ...
- MySQL支持emoji
方案1: 应用层支持 MySQL默认的数据库编码是utf8,对于emoji文字是不能直接存储的,要想存储emoji,有许多库支持对emoji的转换,例如将
- 一个简单二叉树的C++实现(一)
很久没有接触二叉树了,写这个当作练手,接下来会比较详细地实现二叉树的各个功能及应用. /* * BinaryTree.cpp * Author: Qiang Xiao * Time: 2015-07- ...