Smallest Bounding Rectangle

Given the Cartesian coordinates of n(>0)2-dimensional points, write a program that computes the area of their smallest bounding rectangle (smallest rectangle containing all the given points).

Input

The input le may contain multiple test cases. Each test case begins with a line containing a positive

integer n(<1001) indicating the number of points in this test case. Then follows n lines each containing

two real numbers giving respectively the x - and y

-coordinates of a point. The input terminates with a

test case containing a value 0 for n which must not be processed.

Output

For each test case in the input print a line containing the area of the smallest bounding rectangle

rounded to the 4th digit after the decimal point.

Sample Input

3

-3.000 5.000

7.000 9.000

17.000 5.000

4

10.000 10.000

10.000 20.000

20.000 20.000

20.000 10.000

0

Sample Output

80.0000

100.0000

最小外接矩形,不会简单的方法,只能将所给点构成凸包,然后枚举凸包上相邻的两点与x轴的夹角作为矩形的倾斜角c,然后求出沿倾斜角c的方向上的凸包映射的长度和垂直倾斜角c的方向上的映射长度为矩形的长和宽.

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#define LL long long using namespace std; const int INF = 0x3f3f3f3f; const int Max = 1011; const double eps = 1e-8; const double Pi = acos(-1.0); int sgn(double x)//精度处理
{
if(fabs(x)<eps)
{
return 0;
}
if(x<0)
{
return -1;
}
else
{
return 1;
}
} struct Point
{
double x,y;
Point() {};
Point(double _x,double _y)
{
x=_x;
y=_y;
}
Point operator - (const Point &b)const
{
return Point(x-b.x,y-b.y);
}
double operator ^ (const Point &b)const
{
return x*b.y-y*b.x;
}
double operator * (const Point &b)const
{
return x*b.x+y*b.y;
}
void transXY(double B)
{
double tx = x,ty=y;
x =tx*cos(B)-ty*sin(B);
y = tx*sin(B)+ty*cos(B);
}
} List[Max]; double dist(Point a,Point b)
{
return sqrt((a-b)*(a-b));
}
int Stack[Max],top; bool _cmp(Point p1,Point p2)//极角排序
{
double tmp = (p1-List[0])^(p2-List[0]);
if(sgn(tmp)>0)
{
return true;
}
else if(sgn(tmp)==0 && sgn(dist(p1,List[0])-dist(p2,List[0]))<=0)
{
return true;
}
else
{
return false;
}
} void Graham(int n)//凸包
{
Point p0;
int k = 0;
p0=List[0];
for(int i=1; i<n; i++)
{
if((p0.y>List[i].y)||(p0.y==List[i].y&&p0.x>List[i].x))
{
p0=List[i];
k=i;
}
}
swap(List[k],List[0]);
sort(List+1,List+n,_cmp);
if(n==1)
{
top=1;
Stack[0]=0;
return ;
}
if(n==2)
{
top= 2 ;
Stack[0]=0;
Stack[1]=1;
return ;
}
Stack[0]= 0 ;
Stack[1]=1;
top=2;
for(int i=2; i<n; i++)
{
while(top>1&&sgn((List[Stack[top-1]]-List[Stack[top-2]])^(List[i]-List[Stack[top-2]]))<=0)
top--;
Stack[top++]=i;
}
} double Get(int n)//计算矩形的最小面积
{
double ant,ans ,dis ;
double x,y;
double sum = INF;
Point a;
for(int i=0; i<n; i++)
{
a=List[Stack[(i+1)%n]]-List[Stack[i]];
ant = atan2(a.y,a.x);//倾斜角
x = 0;
y = 0;
for(int j=0; j<n; j++)
{
a=List[Stack[(j+1)%n]]-List[Stack[j]];
dis =sqrt(a.x*a.x+a.y*a.y);
ans = atan2(a.y,a.x);
x+=fabs(dis*sin(ans-ant));//映射总和
y+=fabs(dis*cos(ans-ant));//映射总和
}
sum = min(x*y,sum);
}
return sum/4; }
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
top = 0;
for(int i=0; i<n; i++)
{
scanf("%lf %lf",&List[i].x,&List[i].y);
}
Graham(n); printf("%.4f\n",Get(top));
} return 0;
}

Smallest Bounding Rectangle - uva10173的更多相关文章

  1. 此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle

    Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a ...

  2. UVA10173 Smallest Bounding Rectangle 最小面积矩形覆盖

    \(\color{#0066ff}{题目描述}\) 给定n(>0)二维点的笛卡尔坐标,编写一个程序,计算其最小边界矩形的面积(包含所有给定点的最小矩形). 输入文件可以包含多个测试样例.每个测试 ...

  3. UVA 12307 Smallest Enclosing Rectangle

    https://vjudge.net/problem/UVA-12307 求覆盖所有点的最小矩形面积.周长 相当于求凸包的最小面积外接矩形.最小周长外接矩形 结论: 这个矩形一定有一条边和凸包上一条边 ...

  4. UVA 12307 Smallest Enclosing Rectangle(旋转卡壳)

    题意:给你一些点,找出两个可以包含所有点的矩形,一个保证矩形面积最小,一个保证矩形周长最小,输出两个最小值 题解:首先根据所有点求一个凸包,再在这个凸包上枚举每条边,作为矩形的一条边(这样可以保证最小 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. [LeetCode] Smallest Rectangle Enclosing Black Pixels 包含黑像素的最小矩阵

    An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...

  7. Smallest Rectangle Enclosing Black Pixels

    An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...

  8. LeetCode Smallest Rectangle Enclosing Black Pixels

    原题链接在这里:https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/ 题目: An image is rep ...

  9. 302. Smallest Rectangle Enclosing Black Pixels

    题目: An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The b ...

随机推荐

  1. C# 在 vs2010 上开发 ActiveX 控件 【千辛万苦啊~】

    由于B/S项目中需要使用到读卡器的功能,但是由于厂家只有提供一个 读卡的dll,那么怎样能在客户端使用读卡器呢,那么进过一番查找,最总决定使用ActiveX 控件来做.由于是第一次接触到 Active ...

  2. copy module

    需求,当有一个实例a,我们需要一个新的实例b,b同a拥有相同的属性. 当我们使用a=b的模式的时候是一个赋值的过程.a和b指向同一个实例.b的任何操作都同a一样. 在这个使用需要使用copy模块.根据 ...

  3. ExtJS笔记 Ext.data.Model

    A Model represents some object that your application manages. For example, one might define a Model ...

  4. 滚动固定TAB在顶部显示

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  5. Variance

    http://mathworld.wolfram.com/Variance.html Variance For a single variate having a distribution with ...

  6. android发送/接收json数据

    客户端向服务器端发送数据,这里用到了两种,一种是在url中带参数,一种是json数据发送方式: url带参数的写法: url+/?r=m/calendar/contact_list&uid=3 ...

  7. Where is the Global.asax.cs file

    I am using VS 2008. I have created a new Asp.net web site project from File->New->Website-> ...

  8. SourceInsight

    进入到Temp Project窗口分别可以以文件列表的方式,列出所有的文件,每个窗体下边有一排按钮,左边的窗口(secondView.cpp)从左至右分别为:按字母顺序排列所有标记.按照文件中行数顺序 ...

  9. zepto源码--核心方法7(管理包装集)--学习笔记

    后面应该会有几篇连续介绍关于zepto包装集的文章.涉及的函数较多,就分别介绍,今天介绍几个使用关系获取包装集的方法.prev, next, first, last, siblings, eq pre ...

  10. zepto源码--核心方法2(class相关)--学习笔记

    继续上篇,本片主要介绍的是$.fn中与class相关的函数,包括hasClass, addClass, removeClass, toggleClass hasClass: 检查对象集合中是否有元素含 ...