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线段交点的更多相关文章

  1. sgu 129 Inheritance 凸包,线段交点,计算几何 难度:2

    129. Inheritance time limit per test: 0.25 sec. memory limit per test: 4096 KB The old King decided ...

  2. 谈谈"求线段交点"的几种算法(js实现,完整版)

    "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助.  ...

  3. hdu 2857:Mirror and Light(计算几何,点关于直线的对称点,求两线段交点坐标)

    Mirror and Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. EDU 50 E. Covered Points 利用克莱姆法则计算线段交点

    E. Covered Points 利用克莱姆法则计算线段交点.n^2枚举,最后把个数开方,从ans中减去. ans加上每个线段的定点数, 定点数用gcs(△x , △y)+1计算. #include ...

  5. poj1066 线段相交简单应用(解题报告)

    #include<stdio.h> #include<math.h> const double eps=1e-8; int n; struct Point { double x ...

  6. 几何+线段交点+spfa(POJ1066)

    Treasure Hunt Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Total ...

  7. hdu 1086(计算几何入门题——计算线段交点个数)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2 ...

  8. 【计算几何初步-线段相交】【HDU1089】线段交点

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  9. matlab练习程序(多线段交点)

    很简单的算法,这里是把每对线段都进行比较了. 还有一种似乎先通过x和y排序再进行交点判断的,不过那种方法我还没看太明白. 这里的方法如下: 1.根据线段的端点求两条直线的交点. 2.判断直线的交点是否 ...

随机推荐

  1. Linux下tar.gz 安装

    将安装文件拷贝至你的目录中 如果是以root身份登录上的,就将软件拷贝至/root中. cp xxx.tar.gz /root 解压缩包 tar xvzf xxx.tar.gz 切换到安装目录下 cd ...

  2. Java HashMap,LinkedHashMap,TreeMap

    Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMapMap主要用于存储健值对,根据 ...

  3. cmd命令 从C盘转到D盘

        点开始 点运行.输入 CMD 回车.进入DOS提示符状态下.输入 cd\ 回车 表示进入 c:\> 也就是C盘根目录下.输入d: 回车 是进入D盘当前目录,并不一定是根目录.然后cd\ ...

  4. 14.7.1&14.7.2

    ArrayList <Object> list = new ArrayList<>(); //实例化ArrayList int i; int j; for(i = 1; i & ...

  5. 求含有n个因子的最小正整数(n<=1000000)

    题目链接:https://ac.nowcoder.com/acm/contest/331/G 思路: 根据唯一分解定理,如果一个数n可以表示成 n=p1a1*p2a2*...*pkak (pi是第i个 ...

  6. C++指针与引用

    1.指针与引用的区别: (1)非空区别.引用不能指向空值. (2)合法性区别.由于指针可能为空,所以需要测试它以防止它为空. (3)可修改区别.引用初始化后不可再被修改. (4)内容区别.指针的内容是 ...

  7. SSH三大框架需要的配置文件

    1. Struts2框架 * 在web.xml中配置核心的过滤器 <filter> <filter-name>struts2</filter-name> <f ...

  8. Mysql的内存优化

     老师  vi mysqld_safe# executing mysqld_safe 后面增加export LD_PRELOAD=/usr/local/lib/libtcmalloc.so  可以做一 ...

  9. Python.__getattr__Vs__getattribute__

    __getattr__ Vs __getattribute__ class Fish(object): def __getattr__(self, key): if key == 'color': p ...

  10. pca总结,非常详细

    #coding=utf- from numpy import * '''通过方差的百分比来计算将数据降到多少维是比较合适的, 函数传入的参数是特征值和百分比percentage,返回需要降到的维度数n ...