如图所示,在由N行M列个单位正方形组成的矩形中,有K个单位正方形是黑色的,其余单位正方形是白色的。
你能统计出一共有多少个不同的子矩形是完全由白色单位正方形组成的吗?
----------------------------------------------------------------------------------------------------
思路:
完全白色矩形数目 = 总个数 - 包含黑块的矩形数目。
包含黑块的矩形数目 = 包含一个黑块 - 包含两个黑块 + 包含三个黑块……
#include <cstdio> #include <cstring> #define MAX(a,b) (a>b?a:b) #define MIN(a,b) (a<b?a:b) #define OO 11111 int coords[1111][2]; int main(){ long long m,n; int left,right,top,bottom; int k,cnt,curs; while(scanf("%lld%lld%d",&n,&m,&k)!=EOF){ for(int i=0;i<k;i++) scanf("%d %d",&coords[i][0],&coords[i][1]); long long ret = n*(n+1)/2*m*(m+1)/2; for(int s=1;s<(1<<k);s++) { curs=s; cnt=0; left=top=OO; right=bottom=-OO; for(int i=0;i<k;i++){ if(curs&1){ cnt++; left=MIN(left,coords[i][1]); right=MAX(right,coords[i][1]); top=MIN(top,coords[i][0]); bottom=MAX(bottom,coords[i][0]); } curs>>=1; } int sgn=(cnt%2)?(-1):1; ret += sgn*left*top*(n+1-bottom)*(m+1-right); } printf("%lld\n",ret); } return 0; }