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精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

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

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

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

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