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毫秒