poj 1032 && zoj 1265 Area
来源:互联网 发布:进出口银行 待遇 知乎 编辑:程序博客网 时间:2024/06/04 20:14
#include<stdio.h>#include<math.h>#include<iostream>#include<algorithm>using namespace std;#define N 102struct point{ double x; double y;}p[N],s[N];double det(double x1,double y1,double x2,double y2){ return x1*y2-x2*y1;}double area(point a,point b,point c){ return det(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y);}bool cmp1(point a,point b) //按照纵坐标从小到大排序{ if(a.y==b.y)return a.x<b.x; return a.y<b.y;}bool cmp2(point a,point b) //按照横坐标从小到大排序{ if(a.x==b.x)return a.y<b.y; return a.x<b.x;}double dot(point a,point b,point c){ return (a.x-c.x)*(b.x-c.x)+(a.y-c.y)*(b.y-c.y);}int main(){ int t,cn=0; double x,y; scanf("%d",&t); while(t--) { int n; cn++; scanf("%d",&n); for(int i=0;i<n;i++) //输入移动的单位 并化为点 { scanf("%lf%lf",&x,&y); if(i==0) { p[i].x=x; p[i].y=y; s[i]=p[i]; } else { p[i].x=p[i-1].x+x; p[i].y=p[i-1].y+y; s[i]=p[i]; } } double ans=0; for(int i=1;i<n-1;i++) //求面积 { ans+=area(p[i],p[(i+1)%n],p[0])/2.0; } double xmin,xmax,ymin,ymax; sort(s,s+n,cmp1); ymin=s[0].y; ymax=s[n-1].y; sort(s,s+n,cmp2); xmin=s[0].x; xmax=s[n-1].x; int ans1=n; for(double i=xmin;i<=xmax;i++) { for(double j=ymin;j<=ymax;j++) { p[n].x=i; p[n].y=j; for(int k=0;k<n;k++) { if(area(p[(k+1)%n],p[n],p[k])==0&&dot(p[(k+1)%n],p[k],p[n])<0) { ans1++; break; } } } } if(cn==1) { printf("Scenario #%d:\n",cn); printf("%d %d %.1lf\n",(int)ans-ans1/2+1,ans1,ans); } else { printf("Scenario #%d:\n",cn); printf("%d %d %.1lf\n",(int)ans-ans1/2+1,ans1,ans); } printf("\n"); } return 0;}