凸边形外壳

原创 2007年09月18日 21:55:00

凸边形外壳

(输入:convex.in  输出:convex.out

Maxwell是一个顽皮的男孩。

一天,他把又白又干净的墙用墨水弄脏了,这时他的妈妈很快就要回来了。Maxwell想找一块白色的凸多边形去盖住这些墨水点。你能告诉他如何用最小面积的凸多边形来盖住这些墨水点吗?

现在,给出这些墨水点的坐标,你需回答出能盖住所有墨水点的凸多边形使面积最小。

 

输入:

输入的第一行是一个确定的整数TT是测试用例的数量。

每个测试用例的第一行是一个整数N0<N105),N是墨水的点数,随后有N行,第i行包括两整数XiYi(0Xi,Yi<20000)表示第i个墨水点的坐标。整数之间用空格分开。

 

输出:

程序每个测试用例的输出由一行组成,即每个用例输出最小的面积,是一实数,保留小数点后一位。

 

样例输入:

2

4

0 0

1 0

0 1

1 1

2

0 0

0 1

样例输出:

1.0

0.0

import java.io.*
import java.util.*
class point 

double x,y; 
boolean bool; 
public point(double x,double y) 

  
this.x=x; 
  
this.y=y; 
  bool
=false
}
 
}
 
class Test8 

public static void main(String[] args) throws Exception 

  BufferedReader bf
=new BufferedReader(new FileReader("convex.in")); 
  
int z=Integer.parseInt(bf.readLine()); 
  
for(int l=0;l<z;l++
  

   
int N=Integer.parseInt(bf.readLine());             
   point p[]
=new point[N]; 
   point ch[]
=new point[N]; 
   point stack[]
=new point[N]; 
   String st[]; 
   
for(int j=0;j<N;j++
   

    st
=bf.readLine().split(" "); 
    p[j]
=new point(Double.parseDouble(st[0]),Double.parseDouble(st[1])); 
   }
 
   
if(N==1||N==2)System.out.println("0.0"); 
   
else{     
     Arrays.sort(p, 
      
new Comparator()
      
public int compare(Object a,Object b)
       point aa
=(point)a; 
       point bb
=(point)b; 
       
if(aa.x==bb.x) 
        
return aa.y<bb.y?-1:1
       
return aa.x<bb.x?-1:1;}
}
); 
     
     
int top=1;     
     stack[
0]=p[0]; 
     stack[
1]=p[1];               
     p[
0].bool=true
     p[
1].bool=true;     
     
for(int i=2;i<N;i++
        

      
while(multiply(p[i],stack[top],stack[top-1])<0
      
{stack[top].bool=false;top--;if(top==0)break;} 
      stack[
++top]=p[i]; 
      stack[top].bool
=true
     }
     
     top
=N-1;     
     
for(int i=0;i<N;i++
        

      
if(p[i].bool==true)continue;       
      stack[top
--]=p[i]; 
     }
     
     top
=1
     ch[
0]=stack[0]; 
     ch[
1]=stack[1];                   
     
for(int i=2;i<N;i++
              

              
while(multiply(stack[i],ch[top],ch[top-1])<=0
              
{top--;if(top==0)break;} 
              ch[
++top]=stack[i]; 
              }
 
     
while(multiply(ch[0],ch[top],ch[top-1])<=0{top--;if(top==0)break;} 
     System.out.println((
new DecimalFormat("0.0")).format(area(ch,top+1))); 
   }
 
  }
   
}
 
public static double area(point p[],int len) 
{   
  
int i; 
  
double sum=0;   
  
for( i=0;i<len-1;i++
  sum
+=det(p[i].x,p[i].y,p[i+1].x,p[i+1].y); 
  sum
+=det(p[i].x,p[i].y,p[0].x,p[0].y);   
  
return Math.abs(sum/2); 
}
 
public static double det(double x1,double y1,double x2,double y2) 

  
return x1*y2-x2*y1; 
}
 
public static double multiply(point p2,point p1,point p0) 

  
return ((p0.x-p1.x)*(p0.y-p2.y)-(p0.x-p2.x)*(p0.y-p1.y)); 
}
 
}
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

凸边形外壳

Problem Description Maxwell is a naughty boy. One day, he fouled the white and clean wall with in...

凸边形外壳(求凸包面积)

Problem Description Maxwell is a naughty boy. One day, he fouled the white and clean wall with in...

凸边形外壳

凸边形外壳 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submi...

凸边形的最优三角剖分

  • 2011-11-05 13:20
  • 882B
  • 下载

凸边形最优三角剖分问题

参考博客:草滩小恪的博客园   网址:http://www.cnblogs.com/acm1314/p/4574606.html

区域赛选拔题--Moon Game--计算几何&&判断平面点集组成的凸边行的个数

【题意】给出平面的一系列的点的坐标,求其中组成凸边形的个数

利用Windows外壳扩展保护文件夹

利用Windows外壳扩展保护文件夹 在Win32操作系统(包括Win9X、Windows NT、Windows 2000)不但有方便的图形用户(GUI)界面,微软还为windows用户界面保留了强...

继续学习MFC——有关外壳图标处理过程

找了一本《MFC技术内幕》的书,英文名MFC Black Book,老美Al Williams写的,很早以前写的啦。不管怎样,让我来学习吧。 从最后一章,哦,是附录A学起吧。附录A有关外壳图标处理过程...

query.ua解析ie、chrome、firefox、360内核、外壳、版本

1、获取浏览器UA字符串 浏览器是用户访问网站的代理窗口,每一个浏览器都有属于自己的代理字符串标示。有一点比较特殊的是,360浏览器的UA却很诡异(祥看:http://qianduanblog....

模拟实现Unix/Linux外壳

模拟实现Unix/Linux外壳注
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)