POJ1066线段交点
题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁数最少("打通一堵墙"即在墙壁所在线段中间位置开一空间以连通外界),输出应打通墙壁的个数(包括边界上墙壁)。 思路:枚举每一个入口,在所有的情况中取穿墙数最少的输出即可,枚举每一个入口的时候,并不用枚举每条边的中间点,直接枚举该线段的两个顶点就行(因为要经过一个墙,那么从线段的任意地方进去都行,不必要每次从线段的中点过去),将枚举的顶点与终点(即宝藏所在位置)连成线段,然后就是判断剩下的线段与该线段相交的问题了(注意这里是严格相交),最后得出的数字加1即为结果(因为还有边界墙),还有就是需要特别处理n=0时的情况。
这里说一下我遇到的问题
前期的准备没有什么问题,初始化操作要加上边缘的4个点
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
#define eps 1e-10
using namespace std;
struct Point
{
double x,y;
Point (double x = 0.0,double y = 0.0):x(x),y(y){}
Point operator - (Point p){return Point(x - p.x,y - p.y);}
};
vector<Point>ps;
struct segment
{
Point p1,p2;
segment(Point p1 = Point(),Point p2 = Point()):p1(p1),p2(p2){}
};
vector<segment> ls;
void init()
{
ps.clear();
ls.clear();
ps.push_back(Point(0.0,0.0));
ps.push_back(Point(100.0,0.0));
ps.push_back(Point(0.0,100.0));
ps.push_back(Point(100.0,100.0));
}
double cross(Point p0,Point p1,Point p2)
{
Point a = p1 - p0;
Point b = p2 - p0;
return a.x * b.y - a.y * b.x;
}
第一个:在判断线段相交的时候是严格相交判断,就是出现两个线段有共同端点的情况(共同端点肯定不是宝藏的点)应该视为一堵墙,就不应视为相交,因为共同端点肯定在最外层,所以一开始我就初始化ans = 1
double ssinset(Point p1,Point p2,Point p3,Point p4)
{
if(cross(p1,p2,p3) * cross(p1,p2,p4) < -eps &&
cross(p3,p4,p1) * cross(p3,p4,p2) < -eps)return true;
else return false;
}
int main()
{
int n;
double x1,y1,x2,y2;
while(~scanf("%d",&n))
{
init();
for(int i = 0;i < n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
Point a(x1,y1);Point b(x2,y2);
ps.push_back(a);
ps.push_back(b);
ls.push_back(segment(a,b));
}
scanf("%lf%lf",&x1,&y1);
Point p0(x1,y1);
int ret = 0x3f3f3f3f;
for(int i = 0;i < ps.size();i++)
{
int ans = 1;
for(int j = 0;j < ls.size();j++)
{
if(ssinset(ps[i],p0,ls[j].p1,ls[j].p2))ans++;
}
ret = min(ans,ret);
}
printf("Number of doors = %d\n",ret);
}
return 0;
}
二次AC,我写的时候忘了考虑问题一了(没有进行严格判断,初始化ans = 0)~~
POJ1066线段交点的更多相关文章
- sgu 129 Inheritance 凸包,线段交点,计算几何 难度:2
129. Inheritance time limit per test: 0.25 sec. memory limit per test: 4096 KB The old King decided ...
- 谈谈"求线段交点"的几种算法(js实现,完整版)
"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. ...
- hdu 2857:Mirror and Light(计算几何,点关于直线的对称点,求两线段交点坐标)
Mirror and Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- EDU 50 E. Covered Points 利用克莱姆法则计算线段交点
E. Covered Points 利用克莱姆法则计算线段交点.n^2枚举,最后把个数开方,从ans中减去. ans加上每个线段的定点数, 定点数用gcs(△x , △y)+1计算. #include ...
- poj1066 线段相交简单应用(解题报告)
#include<stdio.h> #include<math.h> const double eps=1e-8; int n; struct Point { double x ...
- 几何+线段交点+spfa(POJ1066)
Treasure Hunt Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) Total ...
- hdu 1086(计算几何入门题——计算线段交点个数)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2 ...
- 【计算几何初步-线段相交】【HDU1089】线段交点
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- matlab练习程序(多线段交点)
很简单的算法,这里是把每对线段都进行比较了. 还有一种似乎先通过x和y排序再进行交点判断的,不过那种方法我还没看太明白. 这里的方法如下: 1.根据线段的端点求两条直线的交点. 2.判断直线的交点是否 ...
随机推荐
- 本博客已经迁移去http://blog.brightwang.com/
本博客已经迁移去http://blog.brightwang.com/ ,感谢各位支持.
- 群晖Nas中搭建Intellij Idea的LicenseServer服务
下载IntelliJIDEALicenseServer(直接找度娘) 准备 shellX 或其他 ssh工具,个人比较喜欢 mobaxterm. 通过 ssh工具连接到群晖中,用户名和密码就是登陆群晖 ...
- sam/bam格式
1)Sam (Sequence Alignment/Map) ------------------------------------------------- 1) SAM 文件产生背景 随着Ill ...
- date.getTime()
Date date = new Date(); System.out.println(date.getTime()); 输出结果是1210745780625 编译时间当时时间大概是2008年5.14好 ...
- 第六章 图(b1)邻接矩阵
- keras—神经网络CNN—MNIST手写数字识别
from keras.datasets import mnist from keras.utils import np_utils from plot_image_1 import plot_imag ...
- Web服务技术协议:REST与SOAP
Web服务技术就有SOAP(Simple Object Access Protocol,简单对象访问协议)和REST(Representational State Transfer,表示性状态转移) ...
- python之面向对象之封装
今天我们终于进入了面向对象,今天做一下面向的封装的总结 #面向对象的封装 #这里定义了一个类,名称为Role,object是所有类的父类 class Role(object): #这里是定义实例的属性 ...
- Jmeter元件作用域
转载自飞测团队
- 岛屿的个数12 · Number of Islands 12
[抄题]: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷] ...