Description
童童和苗苗最近迷上了开心农场,可是苗苗总是偷童童的菜,愤怒的童童现在要进行反击了!!!
苗苗的农场是一块无限大的矩形土地(如下图),其黑色部分都被种上了值钱的黑凤梨,白色部分都种上了颜值爆表的猴赛雷。爱美的童童决定选择一个矩形区域偷走其中的猴赛雷。
苗苗的农场(左下角坐标为(1,1))如下:
白色部分与黑色部分都是 1 * 1 的正方形。
童童已经做好了计划,现在她给出了她要偷的矩形区域的左下角点的坐标和右上角点的坐标,现在她想请你帮忙计算一下,她能偷走多少块土地的猴赛雷。
Input
第一行输入两个整数Px1和Py1,分别代表左下角点的横坐标和纵坐标。
第二行输入两个整数Px2和Py2,分别代表右上角点的横坐标和纵坐标。
所有整数均不大于 INT(2147483647)
Output
输出一个整数,代表指定的矩形区域中总共有多少块种猴赛雷的土地。
Sample Input
2 2
4 4
Sample Output
4
emmmm看样例,我们习惯坐标代表点,但是这个题,坐标代表的是格子。乍一看,不少人想要用循环做这个题,但是题目提示数据量很大,而且开不了那么大的二维数组。所以我们只能想一个简单的办法,算一下。
农田是黑白相间的,这是我们不习惯的,那么有没有方法可以让他一行黑,一行白呢?当然有呀,我们自己假设一下就好了,这个时候就考虑奇数行偶数行了。如果是偶数行,那么白色的数量就是整个面积的一半;如果是奇数行,那么我们可以先算里边的偶数行,这样还剩一行需要单独处理。
大体思路我们已经知道了,那么接下来我们就需要考虑对应面积里有几个白,几个黑。这个也是有规律的!我们通过观察黑白格可以发现,“奇数行奇数列、偶数行偶数列”这两种情况所对应的格子必定是黑色的。“奇数行偶数列、偶数行奇数列”对应的一定是白格子!
那么对奇数行最后一行的处理也就迎刃而解了。如果对应区域左侧第一个是黑色,那么直接最后一行格子数量除二;如果是白色,则需要考虑最后一个是黑色和白色两种情况。若为黑色,除二,若为白色,除二后加一。
这里在提示一下,坐标相加若为偶数,则为黑色,反之为白色。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int main()
{
long long int s=0;
long long int px1,py1,px2,py2;
while(scanf("%lld %lld",&px1,&py1)!=EOF)
{
s=0;
scanf("%lld %lld",&px2,&py2);
if((py2-py1+1)%2==0)
s+=((py2-py1+1)/2*(px2-px1+1));
else
{
s+=((py2-py1+1)/2*(px2-px1+1));
if((px1%2==0&&py2%2==0)||(px1%2!=0&&py2%2!=0))
s+=(px2-px1+1)/2;
else if((px1+py2)%2!=0)
{
if((px2+py2)%2==0)
s+=(px2-px1+1)/2;
else
s+=((px2-px1+1)/2)+1;
}
}
printf("%lld\n",s);
}
return 0;
}