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. 关于JQuery设置checkbox checked 的问题

    近日做一个关于JQuery表单验证,有一个比较奇葩的要求,即checkbox是为必填项,textbox不是必填的. 而checkbox与textbox又是相关的,填写了textbox,则其上方的che ...

  2. Ajax提交后台中文乱码问题

    今天项目组同事反映,之前有一个正常的请求,今天突然后台获取参数的值出现了中文乱码,怀疑是之前更新jar包所致,笔者仔细想了想更新的内容,仿佛没有涉及到编码的变更啊,然后开始排查,首先后台加了强制以ut ...

  3. 织梦5.7 TAG、标题、栏目以及keywords长度字符数限制修改

    织梦5.7 TAG.标题.栏目以及keywords长度字符数限制修改[图文]   标签: 织梦关键词长度修改 织梦tag长度修改 织梦标题长度修改 织梦栏目长度限制修改 织梦修改 分类: 技术操作   ...

  4. 使用 mock.js 让前端开发与后端独立

    直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  5. Mysql忽略文件名的安全编码

    author:skatetime:2014/09/28 mysql如何删除以"#sql-"开头的临时表 现象:在重建索引后,发现Mysql服务器的磁盘空间快满了 在用如下命令重建索 ...

  6. 百度开源富文本编辑器 UEditor配置:图片上传和文件上传独立使用方法

    使用UEditor编辑器自带的插件实现图片上传和文件上传功能,这里通过配置UEditor单独使用其内置的第三方插件swfupload来实现图片和文件的上传,通过对UEditor配置轻松实现图片批量上传 ...

  7. MBR(Master Boot Record)主引导记录分析

    root@ubuntu1404:/home/chen# fdisk -l /dev/sda1 Disk /dev/sda1: MB, bytes heads, sectors/track, cylin ...

  8. Java项目中的classpath

    一. 首先 classpath 是指 :项目路径\target\classes目录: 二.解释classes含义: 1.存放各种资源配置文件 2.存放模板文件 3.存放class文件, 对应的是项目开 ...

  9. 解决Windows下运行php Composer出现SSL报错的问题

    解决Windows下运行php Composer出现SSL报错的问题 2015-01-14 20:05   在windows下运行composer却出现SSL报错: E:\www>php -f  ...

  10. Yii源码阅读笔记(二十四)

    Module类中获取子模块,注册子模块,实例化控制器,根据路由运行指定控制器方法的注释: /** * Retrieves the child module of the specified ID. * ...