Smallest Bounding Rectangle - uva10173
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的更多相关文章
- 此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle
Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a ...
- UVA10173 Smallest Bounding Rectangle 最小面积矩形覆盖
\(\color{#0066ff}{题目描述}\) 给定n(>0)二维点的笛卡尔坐标,编写一个程序,计算其最小边界矩形的面积(包含所有给定点的最小矩形). 输入文件可以包含多个测试样例.每个测试 ...
- UVA 12307 Smallest Enclosing Rectangle
https://vjudge.net/problem/UVA-12307 求覆盖所有点的最小矩形面积.周长 相当于求凸包的最小面积外接矩形.最小周长外接矩形 结论: 这个矩形一定有一条边和凸包上一条边 ...
- UVA 12307 Smallest Enclosing Rectangle(旋转卡壳)
题意:给你一些点,找出两个可以包含所有点的矩形,一个保证矩形面积最小,一个保证矩形周长最小,输出两个最小值 题解:首先根据所有点求一个凸包,再在这个凸包上枚举每条边,作为矩形的一条边(这样可以保证最小 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [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 ...
- 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 ...
- LeetCode Smallest Rectangle Enclosing Black Pixels
原题链接在这里:https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/ 题目: An image is rep ...
- 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 ...
随机推荐
- userAgent
我们可以通过userAgent来判断,比如检测某些关键字,例如:AppleWebKit*****Mobile或AppleWebKit,需要注意的是有些浏览器的userAgent中并不包含AppleWe ...
- Spring.Net 配置文件
方法一. 直接在程序配置文件中配置 <configuration> <configSections> <sectionGroup name="spring&qu ...
- Beta阶段站立会议-02
项目名:在线考试系统 组名:金州勇士 组长:尹良亮 组员:王汉斌.杜月.闫浩楠 代码地址: ssh:git@git.coding.net:handsomeman/examm.githttps://gi ...
- 用户、组或角色 '' 在当前数据库中已存在。 (Microsoft SQL Server,错误: 15023)
SQLServer2008用户组或角色'*****'在当前数据库中已存在问题的解决办法 在迁移数据库的过程中SQLServer SDE的问题 为一个数据库添加一个用户时,提示以下信息:用户.组或角色 ...
- Linux学习笔记---用户管理---帐号管理
root管理 (1)新增用户:useradd -u 指定UID -g 指定GID -G 作为组员添加到某个组 -M 不创建主用户目录 -m 创建主用户目录 -c 用户信息说明列 -d 指定某个目录为主 ...
- C语言输入多组问题~ungetc回退字符到stdin
题目描述 输入数组长度 n 输入数组 a[1...n] 输入查找个数m 输入查找数字b[1...m] 输出 YES or NO 查找有则YES 否则NO . 输入描述: 输入有多组数据 ...
- 20145209&20145309信息安全系统设计基础实验报告 (3)
实验内容.步骤与体会: 实验过程的理解,实验指导书中知识点的理解. (1)为什么在双击了GIVEIO和JTAG驱动安装文件后还需要手动进行配置? 因为安装文件只是将驱动文件释放了出来,并没有在系统中将 ...
- Ignoring Extra Elements in mongoDB C# Driver
MongoDB删除字段后会报错: Element ... does not match any field or property of class Customer. 需要在实体类增加 [BsonI ...
- 【Android测试】【第十八节】Espresso——环境搭建
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5604642.html 前言 首先还是老规矩,看看官方文档吧 ...
- JS对象之间的关系
JS对象类型 JS中,可以将对象分为"内部对象"."宿主对象"和"自定义对象"三种. 1.本地对象 ECMA-262定义为"独立于 ...