题目连接: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;
}