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维 ...
随机推荐
- hdoj 2222 Keywords Search(AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路分析:该问题为多模式匹配问题,使用AC自动机解决:需要注意的问题是如何统计该待查询的字符串包 ...
- python实现的文本编辑器 - Skycrab - 博客频道 - CSDN.NET
Download Qt, the cross-platform application framework | Qt Project Qt 5.2.1 for Windows 64-bit (VS 2 ...
- block 解析 - 成员变量
回顾 在 上一篇 中我们讲了截获变量特性,对于局部变量,变量不加__block修饰符,在block内部是无法修改变量的值.而且 对值类型的修改,如果block初始化后,无法同步到block内部 对于指 ...
- xhprof安装记录
选择一个工具分析PHP函数调用的资源耗用明细,以图表化的形式展现,方便优化代码. 安装xhprof $ pecl install xhprof-beta 在php.ini引用的extension中 ...
- Java 使用Dom4j和JFileChooser实现xml文件的自主选择路径导出
直接来个简单的例子,大家一看便知. Document doc=DocumentHelper.createDocument();//创建document Element rootElement=doc. ...
- python中decorator
先讲一下python中的@符号 看下面代码 @f @f2 def fun(args, args2, args3, args4, ……): pass 上面代码相当于 def fun(args, args ...
- 五毛的cocos2d-x学习笔记03-控件
VS2013快捷键:注释,Ctrl+K+C:取消注释Ctrl+K+U.都是单行.要实现多行注释与取消注释,就选中多行.run方法调用了AppDelegate的applicationDidFinishL ...
- linux账户管理(centos)
1./etc/passwd 非常详细的/etc/passwd解释 http://luzl.iteye.com/blog/564404 vi /etc/passwd,可以看到如下信息,在最后一行可以看到 ...
- Spring AOP报错
八月 01, 2016 10:08:48 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRe ...
- git配合tortoiseGit的基础使用
转载自:http://www.cnblogs.com/ssor/archive/2012/02/04/2337823.html 一定要自己写出来才能牢记,所以我来写一下 git确实比svn好用的多了, ...