PersonalCorpus 版 (精华区)
// same as dynamic@zsu 's
// 318476 2003-10-19 20:32:31 Accepted 1010 C++ 00:00.10 404K sino@HIT
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include <ctype.h>
double multi(double a, double b, double c, double d, double e, double f)
{
/*A(a,b) B(c,d) | O(e,f)*/
/* if >0 OA在OB顺时针方向*/
/* if <0 OA在OB逆时针方向*/
/* if =0 共线,方向可以相同或相反*/
return (a-e)*(d-f)-(c-e)*(b-f);
}
bool intersect(double a, double b, double c, double d, double e,
double f, double g, double h)
{
if((c>=e)&&(g>=a)&&(max(b,d)>=min(f,h))&&(max(f,h)>=min(b,d))
&&(multi(e,f,c,d,a,b)*multi(c,d,g,h,a,b)>0)
&&(multi(a,b,g,h,e,f)*multi(g,h,c,d,e,f)>0))
return true;
else return false;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("i1010.txt","r",stdin);
freopen("o1010.txt","w",stdout);
#endif
int i,j,k,n,t=0;
double p[1002][2],res;
bool ok;
while (1) {
scanf("%d\n",&n);
if (n==0) break; else t++;
if (t>1) printf("\n");
for (i=0;i<n;i++) scanf("%lf%lf\n",&p[i][0],&p[i][1]);
if (n<3) {
ok=true;
} else {
p[n][0]=p[0][0]; p[n][1]=p[0][1];
p[n+1][0]=p[1][0]; p[n+1][1]=p[1][1];
ok=false;
}
if (!ok) {
for (i=0;i<n;i++) {
for (j=(i+1)/n;j<i-1;j++)
if ((multi(p[i][0],p[i][1],p[j+1][0],p[j+1][1],p[j][0],p[j][1])*
multi(p[i+1][0],p[i+1][1],p[j+1][0],p[j+1][1],p[j][0],p[j][1])<=0)&&
(multi(p[i+1][0],p[i+1][1],p[j][0],p[j][1],p[i][0],p[i][1])*
multi(p[i+1][0],p[i+1][1],p[j+1][0],p[j+1][1],p[i][0],p[i][1])<=0)) {
ok=true;
break;
}
if (ok) break;
}
}
res=0;
for(i=0;i<n;i++){
res+=p[i][0]*p[(i+1)%n][1];
res-=p[i][1]*p[(i+1)%n][0];
}
res = fabs(res/2);
if (ok) printf("Figure %d: Impossible\n",t);
else printf("Figure %d: %.2lf\n",t,res);
}
}
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.146毫秒