nyoj 1101 So Easy[II]: click here
hdu 2036 改革春风吹满地:click here
求多边形的面积的方法:
就是利用叉积的几何意义:以两向量为邻边的平行四边形的有向面积。
nyoj 这道题是按顺时针给出的点。而hdu上的按逆时针的顺序给出的。 最后有一个绝对值判断,使得求出的面积都是正的。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e2 + 4;
struct Point{
double x, y;
}p[N];
struct Vector{
double x, y;
};
double operator *(Vector a, Vector b){
return a.x * b.y - b.x * a.y;
}
int n;
double f(){
double sum = 0;
Vector a, b;
for(int i = 1; i < n - 1; i ++){
a.x = p[i].x - p[0].x; a.y = p[i].y - p[0].y;
b.x = p[i + 1].x - p[0].x; b.y = p[i + 1].y - p[0].y;
sum += (a * b) * 0.5;
}
return sum;
}
int main(){
while(~scanf("%d",&n)){
for(int i = 0; i < n; i ++){
scanf("%lf %lf", &p[i].x, &p[i].y);
}
double ans = f();
printf("%.2lf\n", fabs(ans));
}
return 0;
}
另二种解法:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const int MAXN = 100 + 10;
struct Point{
double x,y;
}p[MAXN];
int N;
int main()
{
while(~scanf("%d",&N))
{
int j;
double area = 0;
for(int i = 0;i < N;++i)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i = 0;i < N;++i){
j = (i+1)%N;
area += p[i].x*p[j].y;
area -= p[i].y*p[j].x;
}
area /= 2.0;
printf("%.2lf\n",area > 0?area:-area);
}
return 0;
}
#include<stdio.h>
typedef struct point{
int x;
int y;
}Point;
Point p[101];
int main()
{
int n,i;
while(scanf("%d",&n)&&n)
{
double area=0;
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(i=0;i<n-1;i++)
area=area+0.5*(p[i].x*p[i+1].y-p[i+1].x*p[i].y);
area=area+0.5*(p[n-1].x*p[0].y-p[0].x*p[n-1].y);
printf("%0.1lf\n",area);
}
return 0;
}