这题水的真不易。。300多行 累死了 对着数据查错啊

枚举每个边上的点到源点 是否中间隔着别的边  每条边划分500份就够了  注意一下与源点在一条直线上的边不算

几何 啊,,好繁琐 参考各种模版。。

 /*
ID: shangca2
LANG: C++
TASK: fence4
*/
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
using namespace std;
typedef struct pointt
{
double x,y;
pointt(double x=,double y=):x(x),y(y){}
}vec;
struct node
{
int x1,y1,x2,y2,o1,o2;
}po[];
vec p,pp[],q[];
int e,n;
vec operator + (vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
vec operator - (pointt a,pointt b){return vec(a.x-b.x,a.y-b.y);}
vec operator * (vec a,double b){return vec(a.x*b,a.y*b);}
vec operator / (vec a,double b){return vec(a.x/b,a.y/b);}
bool operator < (const pointt &a,const pointt &b)
{
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
const double eps = 1e-;
int dcmp(double x)
{
if(fabs(x)<eps) return ;
else return x<?-:;
}
bool operator == (const pointt &a,const pointt &b)
{
return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
}
double dot(vec a,vec b)
{
return a.x*b.x+a.y*b.y;
}
double cross(vec a,vec b)
{
return a.x*b.y-a.y*b.x;
}
bool segprointer(pointt a1,pointt a2,pointt b1,pointt b2)
{
double c1 = cross(a2-a1,b1-a1),c2 = cross(a2-a1,b2-a1),
c3 = cross(b2-b1,a1-b1),c4 = cross(b2-b1,a2-b1);
return dcmp(c1)*dcmp(c2)<&&dcmp(c3)*dcmp(c4)<;
}
bool cmp(node a,node b)
{
if(a.o2==b.o2)
return a.o1<b.o1;
return a.o2<b.o2;
}
int judge(int i,int j)
{
int g; for(g = ; g <= n ; g++)
{
if(g==i)
continue;
if(segprointer(q[j],p,pp[g],pp[g+]))
break;
}
if(g==n+)
{
e++;
if(i==n)
{
po[e].x1 = pp[i+].x;
po[e].y1 = pp[i+].y;
po[e].x2 = pp[i].x;
po[e].y2 = pp[i].y;
po[e].o1 = ;
po[e].o2 = i;
}
else
{
po[e].o1 = i;
po[e].o2 = i+;
po[e].x1 = pp[i].x;
po[e].y1 = pp[i].y;
po[e].x2 = pp[i+].x;
po[e].y2 = pp[i+].y;
}
return ;
}
return ;
}
double xmult(vec p1,vec p2,vec p3)
{
return (p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y);
}
int dots(vec p1,vec p2,vec p3)
{
return dcmp(xmult(p1,p2,p3));
}
int main()
{
freopen("fence4.in","r",stdin);
freopen("fence4.out","w",stdout);
int i,j,o,g;
cin>>n;
cin>>p.x>>p.y;
for(i = ;i <= n ; i++)
cin>>pp[i].x>>pp[i].y;
pp[n+] = pp[];
for(i = ; i <= n ; i++)
{
for(j = ; j <= i- ; j++)
{
if(i==n&&j==)
continue;
if(segprointer(pp[i],pp[i+],pp[j],pp[j+]))
{
puts("NOFENCE");
return ;
}
}
}
vec no;
for(i = ; i <= n ; i++)
{
if(!dots(p,pp[i],pp[i+]))
continue;
o = ;
int fo=;
if(pp[i+].x==pp[i].x)
{
double x1 = pp[i].x;
double y1;
if(pp[i].y<pp[i+].y)
{
double xx = (pp[i+].y-pp[i].y)/300.0;
y1 = pp[i].y+xx;
while(y1<pp[i+].y)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
break;
}
y1+=xx;
}
}
else
{
double xx = (pp[i].y-pp[i+].y)/300.0;
y1 = pp[i].y-xx;
while(y1>pp[i+].y)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
break;
}
y1-=xx;
}
}
}
else if(pp[i+].y==pp[i].y)
{ double x1;
double y1=pp[i].y;
if(pp[i+].x>pp[i].x)
{
double xx = (pp[i+].x-pp[i].x)/500.0;
x1 = pp[i].x+xx;
while(x1<pp[i+].x)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
break;
}
x1+=xx;
}
}
else
{
double xx = (pp[i].x-pp[i+].x)/500.0;
x1 = pp[i].x-xx;
while(x1>pp[i+].x)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
if(i==)
cout<<x1<<" "<<y1<<endl;
break;
}
x1-=xx;
}
}
}
else
{
double d = (pp[i+].y-pp[i].y)/(pp[i+].x-pp[i].x);
double k1,x1,y1;
double xx = fabs((pp[i+].x-pp[i].x)/500.0);
k1 = 1.0*fabs(d);
if(pp[i+].x>pp[i].x&&pp[i+].y>pp[i].y)
{
x1 = pp[i].x+0.1;
y1 = pp[i].y+0.1*k1;
while(x1<pp[i+].x&&y1<pp[i+].y)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
break;
}
x1+=xx;
y1+=xx*k1;
}
}
else if(pp[i+].x<pp[i].x&&pp[i+].y>pp[i].y)
{
x1 = pp[i].x-0.1;
y1 = pp[i].y+0.1*k1;
while(x1>pp[i+].x&&y1<pp[i+].y)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
break;
}
x1-=xx;
y1+=xx*k1;
}
}
else if(pp[i+].x<pp[i].x&&pp[i+].y<pp[i].y)
{
x1 = pp[i].x-0.1;
y1 = pp[i].y-0.1*k1;
while(x1>pp[i+].x&&y1>pp[i+].y)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
break;
}
x1-=xx;
y1-=xx*k1;
}
}
else
{
x1 = pp[i].x+0.1;
y1 = pp[i].y-0.1*k1;
while(x1<pp[i+].x&&y1>pp[i+].y)
{
o++;
q[o].x = x1;
q[o].y = y1;
if(judge(i,o))
{
fo = ;
break;
}
x1+=xx;
y1-=xx*k1;
}
}
}
}
sort(po+,po+e+,cmp);
cout<<e<<endl;
for(i = ; i <= e ; i++)
{
cout<<po[i].x1<<" "<<po[i].y1<<" "<<po[i].x2<<" "<<po[i].y2<<endl;
}
return ;
}

USACO3.41Closed Fences(几何)的更多相关文章

  1. USACO3.31Riding the Fences(输出欧拉路径)

    都忘了欧拉路径是什么了.. 用dfs搜 标记边  刚开始直接从I-N搜 直接超时 2了 先找符合起点和终点的点搜 即度数是奇数 d单dfs也超了 后来换了个姿势.. /* ID: shangca2 L ...

  2. BZOJ 1719--[Usaco2006 Jan] Roping the Field 麦田巨画(几何&区间dp)

    1719: [Usaco2006 Jan] Roping the Field 麦田巨画 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 82  Solved ...

  3. HDU 5128.The E-pang Palace-计算几何

    The E-pang Palace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Othe ...

  4. 关于Three.js基本几何形状之SphereGeometry球体学习

    一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...

  5. 几何服务,cut功能测试

    关于几何服务 几何服务用于辅助应用程序执行各种几何计算,如缓冲区.简化.面积和长度计算以及投影.在 ArcGIS Server 管理器中启动几何服务之后,您才能够在应用程序开发过程中使用该服务. 问题 ...

  6. 几何服务,cut功能,输入要素target(修改后)内容。

    几何服务,cut功能测试,输入要素target(修改后)内容. {"displayFieldName":"","fieldAliases": ...

  7. 几何服务,cut功能,输入要素target(修改前)内容。

    几何服务,cut功能测试,输入要素target(修改前)内容. {"geometryType":"esriGeometryPolyline","geo ...

  8. 如何让你的UWP应用程序无缝调用几何作图

    有时候需要编辑一些几何图形,如三角形,圆锥曲线等,在UWP应用中加入这些几何作图功能是件费时间又很难做好的事.其实Windows 10 应用商店中已有一些专业的几何作图工具了,那么能借来一用吗?答案是 ...

  9. poj 2031Building a Space Station(几何判断+Kruskal最小生成树)

    /* 最小生成树 + 几何判断 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 */ #include<iostream> #incl ...

随机推荐

  1. PhotoView开源项目剖析

    http://blog.csdn.net/wu928320442/article/details/43056731 介绍 上一节呢,我们介绍了怎么下载和编译Android源码,这节呢,我们来讨论Pho ...

  2. 第二篇:gradle脚本运行环境分析(gradle的语义模型)

    引言:通过上一篇的论述,我们知道gradle脚本是如假包换的groovy代码,但是这个groovy代码是运行在他的上下文环境里面的,学名叫语义模型.这一篇我们就来看看他的语义模型到底是什么,如何使用. ...

  3. bootstrap paginator 与 bootstrap3兼容

    bootstrap paginator可支持bootstrap2 和bootstrap3. 默认的下载包中支持2,需要手动修改才能支持bootstrap3.具体方法:找到bootstrap-pagin ...

  4. 获取汉字拼音 Java

    两种方法:一个是使用btye数组,一个是引入jar包进行操作. 1. public class CharacterParser { private static int[] pyvalue = new ...

  5. 我的微软.net演进路线图

    原文地址:我的微软.net演进路线图 我的微软.net演进路线图 我的这几年,编程方面主要是跟在微软旗下奔跑的,主要语言是C# 集成开发环境(IDE) .NET Framework版本 介入年份 Vi ...

  6. JSP EL表达式详细介绍

    一.JSP EL语言定义 E L(Expression Language)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...

  7. Mysql笔记【1】-数据库的基本操作(创建/删除)

    1.创建数据库 创建数据库(如果存在,则报错) #创建名称为test的数据库 create database test 查询创建完的数据库 show databases 2.删除数据库 删除数据库(如 ...

  8. 销毁session

    session运行在服务器是单用户,每个session都有一个唯一的sessionid 用法:session.setAttribute("userName", "张三丰& ...

  9. Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)

    转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...

  10. session绑定线程