http://poj.org/problem?id=1264
这题很看郁闷,看了很久才明白是什么意思。大致就是有数个国家,每个国家有数个房子,房子相互连接组成的最小周长的多边形为该国家领土,当输入-1时国家输入完毕,接下来是多个炸弹的降落地点。国家的个数最多为20,炸弹可以无限个。若炸弹在某个国家的领土内爆炸(包括边),则可看成该国领土所有面积被炸(当然原文不是这样说),求所有被炸的面积。
思路其实很明了,求出每个国家的凸包,若炸弹在凸包内,则计算所有这样凸包面积的和。要注意可能多个炸弹在落在同一个国家内,这时候只要算一个即可。
判断点在多边形内的算法有很多种,这里用到的是外积法:设待判断的点为p,逆时针或顺时针遍例多边形的每个点vn,将两个向量<p, vn>和<vn, vn + 1>做外积。如果对于多边形上所有的点,外积的符号都相同(顺时针为负,逆时针为正),则可断定p在多边形内。外积出现0,则表示p在边上,否则在多边形外。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int num,top,ii;
struct node
{
int x;
int y;
}a[105],mis[50005]; //b当栈使用
struct
{
node b[25];
int to;
}an[25];
int cmp(const void *c,const void *d)
{
int ans;
struct node *p1=(node *)c;
struct node *p2=(node *)d;
ans=(p1->x-a[0].x)*(p2->y-a[0].y)-(p2->x-a[0].x)*(p1->y-a[0].y);        
if (ans>0) return -1;
else if (ans<0) return 1;
else 
{
if (abs(a[0].x-p1->x)<abs(a[0].x-p2->x)) return 1;
return -1;
}
}
int find( int p2,int p1,int p0)   //叉乘判断转向p0p1*p0p2
{
return (an[ii].b[p1].x-an[ii].b[p0].x)*(a[p2].y-an[ii].b[p0].y)-(a[p2].x-an[ii].b[p0].x)*(an[ii].b[p1].y-an[ii].b[p0].y);
}
int find2( node p2,node p1,node p0)   //叉乘判断转向p0p1*p0p2
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
void Graham(int n)
{
int i;
a[n]=a[num];       //将y最小的点当成极坐标的原点
a[num]=a[0];
a[0]=a[n];
qsort(a+1,n-1,sizeof(a[0]),cmp);  //按极角由小到大(逆时针)排序,有多个极角相同的,按离原点近的排
an[ii].b[0]=a[0];
an[ii].b[1]=a[1];
top=1;
for (i=2;i<n;i++)
{
while (find(i,top,top-1)<0) top--;     //如果向右转,就把栈顶退一个,直到新加入的点是向左转为止
an[ii].b[++top]=a[i];                   //进栈
}
}
int main ()
{
// freopen ("1.txt","r",stdin);
int n,i,j,k,h,minx=10005,miny=10005,dis,max,misnum,sum;
double area;
ii=0;
while(scanf("%d",&n),n!=-1)
{
minx=10005;miny=10005;
for (i=0;i<n;i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
if (a[i].y<miny || (miny==a[i].y && a[i].x<minx))       //记录y值最小的点 有多个时 选x最小的
{
miny=a[i].y;minx=a[i].x;num=i;
}
}
Graham(n);
an[ii].to=top;
ii++;
}
i=0;
while(scanf("%d%d",&mis[i].x,&mis[i].y)!=EOF)
i++;
misnum=i;area=0;
for(i=0;i<ii;i++)
{
for(j=0;j<misnum;j++)
{
for(k=0;k<=an[i].to;k++)
{
if(k==an[i].to)
{
if(find2(mis[j],an[i].b[0],an[i].b[k])<0)
break;
}                
else if(find2(mis[j],an[i].b[k+1],an[i].b[k])<0)
break;
}
if(k==an[i].to+1)  //mis[j]若点在凸包内计算凸包面积 
{
sum=0;
for(h=0;h<an[i].to;h++)
sum+=an[i].b[h].x*an[i].b[h+1].y-an[i].b[h].y*an[i].b[h+1].x;
sum+=an[i].b[h].x*an[i].b[0].y-an[i].b[h].y*an[i].b[0].x;
area+=sum*1.0/2;
break;//跳出因为有能可能多点在同一个凸包内 
}
}
}
printf("%.2f\n",area);
//  system("pause");
return 0;
}

转载于:https://www.cnblogs.com/zxj015/archive/2011/03/28/2740253.html

poj 1264 hdu 1616 SCUD Busters 凸包+面积计算相关推荐

  1. poj 1264 || UVA 109 SCUD Busters

    UVA这题过得蛮多人的,觉得应该是个水题吧. 一读题,也不麻烦,给你N个王国,求下凸包,再求面积.给你一些炮弹,问炮弹炸掉的面积.(一个炮弹炸的话,整个王国都被炸了). 直接求凸包后,求出各个王国的面 ...

  2. POJ1264 SCUD Busters 凸包

    POJ1264 有m个国家(m<=20)对每个国家给定n个城镇 这个国家的围墙是保证围住n个城镇的周长最短的多边形 必然是凸包 进行若干次导弹发射 落到一个国家内则国家被破坏 最后回答总共有多少 ...

  3. UVa 109 SCUD Busters (凸包面积判断点是否在凸包内部)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. UVa 109 - SCUD Busters(凸包计算)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  5. UVa Problem 109 - SCUD Busters

    // UVa Problem 109 - SCUD Busters // Verdict: Accepted // Submission Date: 2011-11-24 // UVa Run Tim ...

  6. uva 109 SCUD Busters

    题意:有很多国家,国家的边界是包括房子和发电站的凸包,当发动战争是,会用飞毛腿导弹摧毁对方的发电站,则这个国家就会灭亡,给出每个国家的点的集合,包括房子和发电站,给出炮弹可以打中的点,计算出被摧毁的国 ...

  7. 【扫描线法】 poj 1177 hdu 1828

    可以看看这里: http://www.cnblogs.com/Booble/archive/2010/10/10/1847163.html 为了写扫描线, 大概写了有史以来最丑的线段树了. poj 1 ...

  8. POJ 3278 / hdu 2717 Catch That Cow (广搜)

    POJ 3278 HDU 2717 广搜题,用一个数组标记就可以过,不标记的话会超内存. 另外,poj的数据要比hdu强一些,比如0 100,这种数据.不特判的话会RE.不过如果不特判,在poj上用C ...

  9. SCUD Busters POJ - 1264(凸包)

    题意:有n个国家,输入国家的坐标让你构建国家的凸包,然后输入炮弹,当炮弹在这个国家里的话国家就被炸毁了求最后被炸毁的总面积. wa的点!!!!有可能反复炸一个国家不能重复计算面积 #include & ...

最新文章

  1. 数组的有关属性和方法
  2. html5 居于页面中心,css笔记:如何让一个div居于页面正中间
  3. 一致性问题和Raft一致性算法——一致性问题是无法彻底解决的,可以说一个分布式系统可靠性达到99.99…%,但不能说它达到了100%...
  4. 交叉编译php-5.6.30,linux下用arm-none-linux-gnueabi交叉编译arm内核模块
  5. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co
  6. pythonre正则表达式1012pythonre正则表达式_python re模块 正则表达式
  7. 盘点全球最厉害的14位程序员,你认识几个?
  8. JavaOne 2012:NetBeans.Next –未来路线图
  9. 笑联 x mPaaS | 12 个模块,全面小程序化,如何打造真正的一次开发复用多端?
  10. Sql Server查询性能优化之走出索引的误区
  11. X server:linux 图形界面原理
  12. 备份数据库的expdp语句_Oracle数据库备份恢复Data Pump Expdp/Impdp参数详解与案例介绍...
  13. 【数据库】sql2008卸载和默认实例的删除
  14. 初识OPPM一页纸项目管理
  15. 华为模拟器 ENSP 教程
  16. OC算法 输出手机号码归属地
  17. JAVA|大小写英文字母表
  18. 神经网络基础知识--感知器,S型神经元,梯度下降法,神经网络架构
  19. 【微信推送】微信专属推送——改源码教程
  20. Linux权限drwxrwxrwx是什么意思?

热门文章

  1. VMware ESX Server 服务器数据恢复实战--攻破VMFS文件系统
  2. 用word2013发布csdn博客
  3. 2017 计算机 暑期学校,2017暑期学校
  4. Python的四个挑战者:Swift、Go、Julia、R
  5. OCR(Optical Character Recognition 光学字符识别)扫盲
  6. 郁闷的打包和诺基亚模拟器
  7. 数值方法的圣经-《应用数值方法(MATLAB实现)》第二版
  8. 服务器系统盘清理工具,服务器内存清理工具
  9. T3登陆,提示Automation错误 解决办法
  10. Scratch3.0----列表