zoj 1721 判断2条线段(完全)相交

2024-09-09 08:18

本文主要是介绍zoj 1721 判断2条线段(完全)相交,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。

2点可达条件:没有线段与这2点所构成的线段(完全)相交。

const double eps = 1e-8 ;double  add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;
}struct  Point{double x , y ;Point(){}Point(double _x , double _y):x(_x),y(_y){}Point operator + (Point o){return Point(add(x , o.x) , add(y , o.y)) ;}Point operator - (Point o){return Point(add(x , -o.x) , add(y , -o.y)) ;}Point operator * (double o){return Point(x*o , y*o) ;}double operator ^(Point o){return add(x*o.y , -y*o.x) ;}double dist(Point o){return sqrt((x-o.x)*(x-o.x) + (y-o.y)*(y-o.y)) ;}void  read(){scanf("%lf%lf" ,&x , &y) ;}
};//判断2条线段完全相交
int  intersection(Point p1 , Point p2 , Point q1 , Point q2){double d1 = (p2 - p1) ^ (q1 - p1) ;double d2 = (p2 - p1) ^ (q2 - p1) ;double d3 = (q2 - q1) ^ (p1 - q1) ;double d4 = (q2 - q1) ^ (p2 - q1) ;return d1 * d2 < 0  &&  d3 * d4 < 0 ;
}struct Line{Point s , t ;Line(){}Line(Point _s , Point _t):s(_s),t(_t){}int intersect(Line o){ // 直线与线段O是否相交return intersection(s , t , o.s , o.t) ;}void read(){s.read() , t.read() ;}friend bool operator < (const Line A ,const Line B){return A.s.x < B.s.x ;}
};vector<Line> lisline  ;
vector<Point> lispoint  ;
double dist[100][100] ;
const  double inf = 1000000 ;int   ok(Line now){for(int i = 0 ; i < lisline.size() ; i++){if(now.intersect(lisline[i])) return 0 ;}return 1 ;
}void  getdist(){int i , j , n = lispoint.size()  ;for(i = 0 ; i < n ; i++){dist[i][i] = inf ;for(j = i+1 ; j < n ; j++){if(ok(Line(lispoint[i] , lispoint[j])))dist[i][j] = dist[j][i] = lispoint[i].dist(lispoint[j]) ;else  dist[i][j] = dist[j][i] = inf ;}}
}double  mindis[100] ;
bool    in[100] ;
double  spfa(){int i , j , u , v , n = lispoint.size() ;memset(in , 0 , sizeof(in)) ;for(i = 0 ; i < n ; i++)  mindis[i] = inf ;queue<int> q ;q.push(0) ;mindis[0] = 0.0 ;in[0] = 1 ;while(! q.empty()){u = q.front() ; q.pop() ;in[u] = 0 ;for(v = 0 ; v < n ; v++){if(dist[u][v] == inf) continue ;if(mindis[u] + dist[u][v] < mindis[v]){mindis[v] = mindis[u] + dist[u][v] ;if(! in[v]){q.push(v) ;in[v] = 1 ;}}}}return mindis[n-1] ;
}int  main(){int t  , k  , n , i  , j  ;double x , y1 , y2 , y3 , y4 ;while(cin>>n && n!= -1){lisline.clear() ;lispoint.clear() ;lispoint.push_back(Point(0.0 , 5.0)) ;for(i = 1 ; i <= n ; i++){cin>>x>>y1>>y2>>y3>>y4 ;lispoint.push_back(Point(x , y1)) ;lispoint.push_back(Point(x , y2)) ;lispoint.push_back(Point(x , y3)) ;lispoint.push_back(Point(x , y4)) ;lisline.push_back(Line(Point(x , 0) , Point(x , y1))) ;lisline.push_back(Line(Point(x , y2) , Point(x , y3))) ;lisline.push_back(Line(Point(x , y4) , Point(x , 10.0))) ;}lispoint.push_back(Point(10.0 , 5.0)) ;getdist() ;double s = spfa() ;if(s == inf)  puts("-1") ;else  printf("%.2lf\n" , s) ;}return 0 ;
}


这篇关于zoj 1721 判断2条线段(完全)相交的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150635

相关文章

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化