题意:
给定你四个数,第一个和第三个代表x坐标,第二个和第四个代表y坐标。让你计算出以下几个矩形所覆盖的总面积。(重叠部分切勿重复计算),每几组数据之间以-1 -1 -1 -1隔开,最后是以-2 -2 -2 -2表示输入的结束。
题解:
把大矩形分割成单位矩形,然后以点代表单位矩形。点的值为1代表单位矩形的面积为1。
这样可以算出第一个矩形的面积。然后输入第二个矩形(同样转化为点),如果点的值已经为1,证明上一个矩形已经覆盖,不进行累加,如果点的值为0,则进行累加。
核心:
for(i=x1; i<x2; i++)
{
for(j=y1; j<y2; j++)
{
if(s[i][j]==0)
{
s[i][j]=1;
num++;
}
}
}
易错点:1.如果把二维数组定义在main函数里面的话,要进行为0的初始化。(memset(s,0,sizeof(s))
2.别忘了比较a,c和b,d的大小。
3.别忘了在下一组数据开始计算面积之前,对上一个数组的值进行归0,避免累加;
难点:本题的输入和输出比较别扭。
#include<bits/stdc++.h>
using namespace std;
#include<iostream>
int main()
{
int a,b,c,d;
int num=0;
int s[101][101];
memset(s,0,sizeof(s));
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
{
if(a==-1&&b==-1&&c==-1&&d==-1)
{
printf("%d\n",num);
num=0;
memset(s,0,sizeof(s));
continue;
}
if(a==-2&&b==-2&&c==-2&&d==-2)
{
printf("%d\n",num);
break;
}
int x1,x2,y1,y2,i,j;
x1=min(a,c);
x2=max(a,c);
y1=min(b,d);
y2=max(b,d);
for(i=x1; i<x2; i++)
{
for(j=y1; j<y2; j++)
{
if(s[i][j]==0)
{
s[i][j]=1;
num++;
}
}
}
}
return 0;
}