【Codeforces】1080C Masha and two friends (棋盘染色)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/87524889

http://codeforces.com/problemset/problem/1080/C

给定一个棋盘,(1,1)的位置是白色,观察可以知道,如果横纵坐标之和是偶数,那么是白色,奇数的话就是黑色。

只要算出染色以后白色方块的数量,减去面积,就可以得到黑色方块的数量

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
typedef long long ll;
using namespace std;

//计算矩形中白色方块的数量 
ll paintw(ll x1,ll y1,ll x2,ll y2)
{
	ll n = x2-x1+1;
	ll m = y2-y1+1;
	//左下角的方块为黑色 
	if((x1+y1)&1)
		return n*m/2;
	//左下角方块为白色 
	else
		return (n*m+1)/2; 
}

ll paintb(ll x1,ll y1,ll x2,ll y2)
{
	ll n = x2-x1+1;
	ll m = y2-y1+1;
	return n*m-paintw(x1,y1,x2,y2);
}

int main ()
{
	ll n,m,T;
	ll x1,y1,x2,y2;
	ll x3,y3,x4,y4;
	cin >> T;
	while(T--)
	{
		cin >> n >> m;
		cin >> x1 >> y1 >> x2 >> y2;
		cin >> x3 >> y3 >> x4 >> y4;
		//计算第一块区域中黑色方块的数量,即将被涂成白色 
		ll b1 = paintb(x1,y1,x2,y2);
		//第二块区域中白色方块的数量,即将被涂成黑色 
		ll w2 = paintw(x3,y3,x4,y4);
		//总共的白色方块的数量 
		ll answ = (n*m+1)/2+b1-w2;
		//看两个矩形是否相交,相交的部分都会变成黑色,所以要计算变黑之前,里面的白色的方块的数量 
		ll minx = min(x2,x4),miny = min(y2,y4);
		ll maxx = max(x1,x3),maxy = max(y1,y3);
		if(minx >= maxx && miny >= maxy)
			answ -= paintb(maxx,maxy,minx,miny);
		cout << answ << " " << n*m-answ << endl;
	}
	return 0;
}

和这个有点像:【ACM】LightOJ - 1010 Knights in Chessboard(不是搜索...)

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/87524889