USACO3.41Closed Fences(几何)
这题水的真不易。。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(几何)的更多相关文章
- USACO3.31Riding the Fences(输出欧拉路径)
都忘了欧拉路径是什么了.. 用dfs搜 标记边 刚开始直接从I-N搜 直接超时 2了 先找符合起点和终点的点搜 即度数是奇数 d单dfs也超了 后来换了个姿势.. /* ID: shangca2 L ...
- BZOJ 1719--[Usaco2006 Jan] Roping the Field 麦田巨画(几何&区间dp)
1719: [Usaco2006 Jan] Roping the Field 麦田巨画 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 82 Solved ...
- HDU 5128.The E-pang Palace-计算几何
The E-pang Palace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Othe ...
- 关于Three.js基本几何形状之SphereGeometry球体学习
一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...
- 几何服务,cut功能测试
关于几何服务 几何服务用于辅助应用程序执行各种几何计算,如缓冲区.简化.面积和长度计算以及投影.在 ArcGIS Server 管理器中启动几何服务之后,您才能够在应用程序开发过程中使用该服务. 问题 ...
- 几何服务,cut功能,输入要素target(修改后)内容。
几何服务,cut功能测试,输入要素target(修改后)内容. {"displayFieldName":"","fieldAliases": ...
- 几何服务,cut功能,输入要素target(修改前)内容。
几何服务,cut功能测试,输入要素target(修改前)内容. {"geometryType":"esriGeometryPolyline","geo ...
- 如何让你的UWP应用程序无缝调用几何作图
有时候需要编辑一些几何图形,如三角形,圆锥曲线等,在UWP应用中加入这些几何作图功能是件费时间又很难做好的事.其实Windows 10 应用商店中已有一些专业的几何作图工具了,那么能借来一用吗?答案是 ...
- poj 2031Building a Space Station(几何判断+Kruskal最小生成树)
/* 最小生成树 + 几何判断 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 */ #include<iostream> #incl ...
随机推荐
- JavaMail组件实现邮件功能
实现邮件收发功能需要3个jar包: 1.JavaMail组件保内的mail.jar和smtp.jar包 2.JAF组件包里的activition.jar. 复制到WebRoot/WEB-INF/lib ...
- MyEclipse2014中项目名更改后如何使用新的项目名部署到Tomcat中去
在项目中调试的时候突然发现我复制的项目(项目名修改过了)部署在Tomcat中运行的时候还是显示的是原来的项目名,以至于我使用新的项目名称作为URL请求竟然是404,我去,当时感觉就不怎么好了. 当然, ...
- 数据库性能优化一:SQL索引一步到位
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...
- weewwe
http://blog.csdn.net/u013073524/article/details/25912891
- Xcode 7 支持http请求info.plist设置
由于iOS9改用更安全的https,为了能够在iOS9中正常使用http发送网络请求,请在"Info.plist"中进行如下配置,否则影响SDK的使用. 1.找到项目中的 Info ...
- MateSublg
MateSublg 说明 使用MetaWeblog的方式提交文章,并自动上传图片. 本插件的官方地址:MateSublg – Sollyu博客 本插件的开源地址:sollyu / MetaSubolg ...
- eclipse下使用java调用weka(转)
原文链接:http://blog.csdn.net/felomeng/article/details/4688257 weka是很好用的机器学习库,这里就不详细介绍了. 言归正传,要使用程序方式使用w ...
- 【实习记】2014-09-01从复杂到简单:一行命令区间查重+长整型在awk中的bug
9月1号,导出sql文件后,想到了awk,但很复杂.想到了用sed前期处理+python排序比较的区间查重法.编写加调试用了约3小时. 9月2号,编写C代码的sql语句过程中,发现排序可以交m ...
- C#实现记事本查找功能
private void button1_Click(object sender, EventArgs e) { if (!(String.IsNullOrEmpty(this.textBox1.Te ...
- z-index使用以及失效的处理方法
1.一般z-index的使用是在有两个重叠的标签,在一定的情况下控制其中一个在另一个的上方出现. 2.z-index值越大就越是在上层.z-index:9999:z-index元素的position属 ...