欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Poj 1113 Wall(凸包)

程序员文章站 2022-03-29 22:47:23
...

题目链接

解析:凸包问题,城堡各点构成的一个凸包,结果就是凸包周长加上一个以要求的距离为半径的圆周(任意凸多边形的外角和都是Poj 1113 Wall(凸包)

总结:1. 成员函数的构造。 2. 四舍五入:(int)(ans + 0.5)。  3. sqrt的参数必须是浮点型。 4. 即使输入的是整数,在计算边长还是会变成小数,用int会影响精度问题。 5. 一组测试数据 

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1005;
int n, l;
struct Point
{
	int x, y;
	Point(int x=0, int y=0): x(x), y(y) {};   //方便后面(,)形式的书写 
	bool operator < (const Point& a) const 
	{
		return (x < a.x) || (x == a.x && y < a.y);
	}
}ch[maxn], p[maxn];
typedef Point Vector;
Vector operator - (Point a, Point b){
	return Vector(a.x-b.x, a.y-b.y);
}
double Dot(Vector a, Vector b){
	return a.x*b.x + a.y*b.y;
} 
double Length(Vector a){
	return sqrt(Dot(a, a));
} 
int Cross(Vector a, Vector b){
	return a.x*b.y - a.y*b.x;
}
int ConvexHull(Point* p, Point* ch)
{
	sort(p, p+n); 
	int top = 0;
	for(int i = 0; i < n; ++ i)
	{
		while(top > 1 && Cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]) <= 0) top --;
		ch[top ++] = p[i];
	}
	int k = top;
	for(int i = n-2; i >= 0; -- i)
	{
		while(top > k && Cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]) <= 0) top --;
		ch[top ++] = p[i]; 
	}
	if(n > 1) top --;
	return top;
}
void solve(int top)
{
	double ans = 0;
	for(int i = 0; i < top; ++ i){
		ans += Length(ch[(i+1)%top]-ch[i]);
	}
	ans += 3.1415926*2*l;
	printf("%d\n",(int)(ans + 0.5));
}
int main()
{
	scanf("%d%d", &n, &l);
	for(int i = 0; i < n; ++ i)
	{
		scanf("%d%d", &p[i].x, &p[i].y);
	}
	int cnt = ConvexHull(p, ch);
	solve(cnt);
	return 0;
}