这题水的真不易。。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. DotNet Core 之旅(一)

    1.下载安装 DotNetCore.1.0.0-SDK.Preview2-x64.exe 下载链接:https://www.microsoft.com/net/download ps:如果有vs201 ...

  2. Ios 给imageview 添加手势没有反应

    道理差不多,简单写写,就是给UIImage所在的UIImageView添加个单击的手势,让用户点击图片时有响应的响应. 有人用个透明的UIButton,感觉有时候不方便.   - (void)view ...

  3. Mac 下显示隐藏文件

    将下面的命令粘贴进终端,按提示操作即可(可能需要输入电脑密码) 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:d ...

  4. C#一些小技巧

    在C#实现类似Typedef的所有功能 Typedef这个关键字,是比较好用的东西,因为有时候我们需要使用一些别名来帮助我们记忆某些结构体或者类的共用.(个人觉得这是C与C++唯一能吸引我的东西)为了 ...

  5. 原生js的数组除重复

    js对数组的操作在平常的项目中也会遇到,除去一些增加,或者减少的操作外,还有一个比较重要的操作就是数组的除重,通过数组的除重,我们可以将一个数组中存在的多个重复的数组进行清理,只留下不重复的.另外下面 ...

  6. 一些简单的帮助类(1)-- String的类型验证

    在工作中经常会遇到 验证String 中的值是否属于Int型或者是Bool又或是Date 一般的做法是用方法 类型.TryParse(string,类型) 来做验证. "; int intV ...

  7. DbUtil组件及C3P0数据库连接池组件的使用

    DbUtils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能. 使用c ...

  8. 在ARM Linux 使用 Valgrind

    Linux valgrind 移植到ARM-Linux  一.Cross-Compile/交叉编译 (1)下载及解压Valgrind-3.11 (2)修改confirure 将armv7*)修改为ar ...

  9. Codevs 1217 借教室 2012年NOIP全国联赛提高组

    1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在大学期间,经常需要租借教 ...

  10. 深入了解relative

    1.relative是自身定位,距原本位置的偏移 2.无侵入布局: 挪动位置,原本位置还在占据,并不会影响其他元素的布局   应用: 实现鼠标拖拽,比自身api好用 3.top/bottom 和 le ...