bzoj1091 切割多边形 枚举&计算几何
2016-03-03 18:51
281 查看
发现边很少只有8条。。那么我们可以枚举每一次用多边形的那一条边去割外面的矩形。显然每一条边一定且只会割一次。然么就是直线求交点了,然后把直线外侧的点全都删掉。
小心割线刚好和外面的多边形在定点相交的特殊情况;以及割最后一条边的特殊情况。
嘴巴AC还是很简单的。。实现就233(其实不算太复杂,细节坑爹啊)
最后吐槽:woc C++什么破编译器调试的时候加一句cout<<i答案居然会不一样。。。真是让人吐血。。。希望有高手看到向我解释为什么~\(≧▽≦)/~辣!!
AC代码如下:
by lych
2016.3.3
小心割线刚好和外面的多边形在定点相交的特殊情况;以及割最后一条边的特殊情况。
嘴巴AC还是很简单的。。实现就233(其实不算太复杂,细节坑爹啊)
最后吐槽:woc C++什么破编译器调试的时候加一句cout<<i答案居然会不一样。。。真是让人吐血。。。希望有高手看到向我解释为什么~\(≧▽≦)/~辣!!
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 25 using namespace std; int n,cnt; double ans=1e200; bool bo ; struct point{ double x,y; }a ,b ; point operator -(point u,point v){ u.x-=v.x; u.y-=v.y; return u; } double crs(point u,point v){ return u.x*v.y-u.y*v.x; } double dist(point u,point v){ return sqrt((u.x-v.x)*(u.x-v.x)+(u.y-v.y)*(u.y-v.y)); } bool upon(point u,point v,point w){ return !crs(u-v,w-v) && (u.x-v.x)*(u.x-w.x)<=0 && (u.y-v.y)*(u.y-w.y)<=0; } bool havitr(point p,point q,point u,point v){ return !upon(p,u,v) && crs(u-p,q-p)<=0 && crs(v-p,q-p)>=0; } point itr(point u,point s,point v,point t){ double tmp=crs(t,u-v)/crs(s,t); u.x+=s.x*tmp; u.y+=s.y*tmp; return u; } void dfs(int k,double now){ if (now>=ans) return; int i,j; if (k>n){ ans=now; return; } point c ,p1,p2; int len=cnt; for (i=1; i<=cnt+1; i++) c[i]=b[i]; for (i=1; i<=n; i++) if (bo[i]){ bo[i]=0; cnt=0; bool ok=1; for (j=1; j<=len; j++) if (havitr(a[i+1],a[i],c[j],c[j+1])){ p1=itr(a[i+1],a[i]-a[i+1],c[j],c[j+1]-c[j]); break; } for (j=1; j<=len; j++) if (havitr(a[i],a[i+1],c[j],c[j+1])){ p2=itr(a[i],a[i+1]-a[i],c[j],c[j+1]-c[j]); break; } for (j=1; j<=len; j++) if (crs(p2-p1,c[j]-p1)<0) b[++cnt]=c[j]; else if (ok){ ok=0; b[++cnt]=p1; b[++cnt]=p2; } b[cnt+1]=b[1]; dfs(k+1,now+dist(p1,p2)); cnt=len; for (j=1; j<=cnt+1; j++) b[j]=c[j]; bo[i]=1; } } int main(){ scanf("%lf%lf",&b[3].x,&b[3].y); int i; b[4].x=b[3].x; b[2].y=b[3].y; cnt=4; scanf("%d",&n); for (i=1; i<=n; i++) scanf("%lf%lf",&a[i].x,&a[i].y); a[n+1]=a[1]; b[cnt+1]=b[1]; memset(bo,1,sizeof(bo)); dfs(1,0); printf("%.3f\n",ans); return 0; }
by lych
2016.3.3
相关文章推荐
- Zigbee单播、组播、广播网络通信
- 《C#高级编程》读书笔记
- Android Cordova 插件开发之自定义插件生成安装包
- 简单法获取屏幕截图
- Linux crontab 命令格式与详细例子
- mybatis调用orcale存储过程-传入多个参数返回结果集
- The first day of learning java
- Android Cordova 插件开发之编写自定义插件
- 异步VS同步、串行VS并行
- MyBatis快速入门
- Android Init Language
- java回顾之错误处理机制
- leetcode 240. Search a 2D Matrix II
- Android Cordova 插件开发之创建项目
- canvas 手写毛笔字效果
- mybatis调用orcale存储过程-传入多个参数返回单个字符
- 2016.3.3 软件开发基础
- iOS之九宫格设计(纯代码)
- UIWebView 的属性、方法的具体使用和详解 与JS的交互
- Android Cordova 插件开发之Cordova安装