热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

poj3433RoadAccident

题目:给你两辆车的左后方和左前方的坐标,车宽和速度,将车看成矩形并分成四部分,问两辆车相撞的位置编号。分析:

题目:给你两辆车的左后方和左前方的坐标,车宽和速度,将车看成矩形并分成四部分,问两辆车相撞的位置编号。

分析:计算几何、线与线的关系判断。

         

            首先,先将分别运动的两车转移到相对参考系,利用速度向量做差即可。

            然后,判断两车相撞,可以分成三种情况:点对点,点对线,线对线。由于点撞到点,一定撞到线上。

                        线对线可以转化成点对线,所以将所有情况转换成点对线即可。将四个顶点和各边的中点构成集合A。

                        将四个顶点和相邻中点的连线构成的8条线段构成集合B。利用A集合的点做速度v方向的射线。

                        如果相撞,则射线一定与线段相交。计算A中的点与交点的距离,取最小的即为最先相撞的部分。

            最后,让两辆车分别向对方相撞(速度相反),整理结果即可。

注意:1.精度问题;2.相撞的区域不一定是最优解,如下图,结果应该是1 1。

            

#include
#include
#include
#include #define esp 1e-6using namespace std;//点结构
typedef struct pnode
{double x,y;int id;pnode( double a, double b ){x = a;y = b;}pnode( double a, double b, int i ){x = a;y = b;id = i;}pnode(){}
}point;//直线线结构
typedef struct lnode
{double x,y,dx,dy;lnode( point a, point b ){x = a.x;y = a.y;dx = b.x-a.x;dy = b.y-a.y;}lnode(){}
}line;//线段结构
typedef struct snode
{point p1,p2;int id;snode( point a, point b, int i ){p1 = a;p2 = b;id = i;}snode(){}
}segment;//车结构
typedef struct cnode
{point p[8];segment s[8];
}car;//构造结点和线段
car madecar( double x, double y, double u, double v, double w )
{car Car;Car.p[0] &#61; point( x, y, 1 );Car.p[2] &#61; point( u, v, 2 );double d &#61; sqrt((x-u)*(x-u)&#43;(y-v)*(y-v));point r &#61; point( (v-y)*w/d, (x-u)*w/d );Car.p[4] &#61; point( u&#43;r.x, v&#43;r.y, 3 );Car.p[6] &#61; point( x&#43;r.x, y&#43;r.y, 4 );for ( int i &#61; 0 ; i <8 ; i &#43;&#61; 2 ) {point m;m.x &#61; (Car.p[i].x&#43;Car.p[(i&#43;2)%8].x)/2;m.y &#61; (Car.p[i].y&#43;Car.p[(i&#43;2)%8].y)/2;m.id &#61; min(Car.p[i].id,Car.p[(i&#43;2)%8].id);Car.p[i&#43;1] &#61; m;}for ( int i &#61; 0 ; i <8 ; &#43;&#43; i ) {Car.s[i] &#61; segment( Car.p[i], Car.p[(i&#43;1)%8], 0 );Car.s[i].id &#61; (i&#43;1)%8/2&#43;1;}return Car;
}//两点间距离
double dist( point a, point b )
{return sqrt((a.x-b.x)*(a.x-b.x)&#43;(a.y-b.y)*(a.y-b.y));
}//直线相交判断
bool lcrossl( line a, line b )
{ double t1 &#61; b.dx*(a.y-b.y)-b.dy*(a.x-b.x); double t2 &#61; b.dx*(a.y&#43;a.dy-b.y)-b.dy*(a.x&#43;a.dx-b.x); return (t1-esp)*(t2-esp) <&#61; 0;
}//求直线交点
point crosspoint( line l, line m )
{ point a &#61; point( m.x, m.y );point b &#61; point( m.x&#43;m.dx, m.y&#43;m.dy );if ( m.dx*l.dy &#61;&#61; m.dy*l.dx ) { if ( dist( point( l.x, l.y ), a ) } //结果结构
typedef struct anode
{int id1,id2;double dis;anode( int a, int b, double d ){id1 &#61; a;id2 &#61; b;dis &#61; d;}
}answer;//判断a撞向b
answer crash( car a, car b, point v )
{double dis &#61; 1e20;int id1 &#61; 1,id2 &#61; 1;for ( int i &#61; 0 ; i <8 ; &#43;&#43; i )for ( int j &#61; 0 ; j <8 ; &#43;&#43; j ) {point c &#61; point( a.p[i].x&#43;v.x, a.p[i].y&#43;v.y );line l &#61; line( b.s[j].p1, b.s[j].p2 );if ( lcrossl( l, line( a.p[i], c ) ) ) {point e &#61; crosspoint( line( a.p[i], c ), l );double d &#61; dist( a.p[i], e );if ( fabs(dis-d) a.p[i].id ) id1 &#61; a.p[i].id;if ( id2 > b.s[j].id ) id2 &#61; b.s[j].id;}if ( dis-esp > d ) {dis &#61; d;id1 &#61; a.p[i].id;id2 &#61; b.s[j].id;}}}return answer( id1, id2, dis );
}int main()
{double x1,y1,u1,v1,w1,s1,x2,y2,u2,v2,w2,s2;while ( ~scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&u1,&v1,&w1,&s1) ) {scanf("%lf%lf%lf%lf%lf%lf",&x2,&y2,&u2,&v2,&w2,&s2);//将输入转化成几何模型&#xff08;8个点&#43;8条线段&#xff09; car A &#61; madecar( x1, y1, u1, v1, w1 );car B &#61; madecar( x2, y2, u2, v2, w2 );//计算速度向量 double d1 &#61; sqrt((x1-u1)*(x1-u1)&#43;(y1-v1)*(y1-v1));point V1 &#61; point( (u1-x1)*s1/d1, (v1-y1)*s1/d1 );double d2 &#61; sqrt((x2-u2)*(x2-u2)&#43;(y2-v2)*(y2-v2));point V2 &#61; point( (u2-x2)*s2/d2, (v2-y2)*s2/d2 );answer an1 &#61; crash( A, B, point( V1.x-V2.x, V1.y-V2.y ) );answer an2 &#61; crash( B, A, point( V2.x-V1.x, V2.y-V1.y ) );if ( fabs(an1.dis-an2.dis) }



推荐阅读
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
author-avatar
零落曦_622
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有