ZOJ 3364题解

题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26405#problem/C

题意:

找出多边形中又都少个白格子和多少个黑格子。(多边形的所有边都是平行一坐标轴的)。

本题的思路:

先把坐标原点移到很远的地方去,那就是给输入的所有坐标都加上10^9;(这样就可以保证所有的坐标都为正),

然后本题的坐标是逆时针给出的,所以令第一个给出的坐标为(x1,y1),令第二个坐标为(x2,y2);若x1==x2,那么

多边形的面积sum+=(x1-x2)*y1;如果x1!=x2,那么把(x2,y2)的值付给(x1,y1),然后输入(x2,y2),重复上面的操作。

便可以得到总面积了。然后再求黑格子的个数。方法同求总面积类似,再求一下(x,y)到原点的面积,如果面积为奇数,那么黑格子和白格子的个数相同,否则,

看看(x+y)是否为偶数,则黑格子要多一个,否则则白格子多一个。

代码:

#include<stdio.h>
#define inf 1000000010
long long T,i,x0,y0,x1,y1,sum,b,temp,x,y;

int main(){
    while(~scanf("%lld",&T)){
        sum=0;b=0;
        scanf("%lld %lld",&x0,&y0);
        x0=x0+inf;
        y0=y0+inf;
        x=x0;
        y=y0;
        for(i=1;i<T;i++){
            scanf("%lld %lld",&x1,&y1);
            x1=x1+inf;
            y1=y1+inf;
            if(y0==y1){
                sum=sum+(x0-x1)*y0;
                //printf("sum=%lld\n",sum);
                temp=x0*y0;
                if(temp%2==0){
                    b+=temp/2;
                }else{
                    if((x0+y0)%2==0){
                        b+=temp/2+1;
                    }else{
                        b+=temp/2;
                    }
                }
                temp=x1*y1;
                if(temp%2==0){
                    b-=temp/2;
                }else{
                    if((x1+y1)%2==0){
                        b-=(temp/2+1);
                    }else{
                        b-=temp/2;
                    }
                }
                x0=x1;
                y0=y1;
            }else{
                x0=x1;
                y0=y1;
            }
            //printf("b=%lld\n",b);
        }
        if(y==y1){
            //printf("%lld\n",(x1-x)*y1);
            sum+=(x1-x)*y1;
            //printf("sum=%lld\n",sum);
            temp=x1*y1;
            if(temp%2==0){
                b+=temp/2;
            }else{
                if((x1+y1)%2==0){
                    b+=temp/2+1;
                }else{
                    b+=temp/2;
                }
            }
            temp=x*y;
            if(temp%2==0){
                b-=temp/2;
            }else{
                if((x+y)%2==0){
                    b-=(temp/2+1);
                }else{
                    b-=temp/2;
                }
            }
        }
        //printf("b=%lld\n",b);
        printf("%lld ",b);
        printf("%lld\n",sum-b);
    }
return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值