问题描述
资源限制
时间限制:2.0s 内存限制:256.0MB
问题描述
X星球的一批考古机器人正在一片废墟上考古。该区域的地面坚硬如石、平整如镜。管理人员为方便,建立了标准的直角坐标系。每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。经过各种测量,每个机器人都会报告一个或多个矩形区域,作为优先考古的区域。矩形的表示格式为(x1,y1,x2,y2),代表矩形的两个对角点坐标。为了醒目,总部要求对所有机器人选中的矩形区域涂黄色油漆。
小明并不需要当油漆工,只是他需要计算一下,一共要耗费多少油漆。
其实这也不难,只要算出所有矩形覆盖的区域一共有多大面积就可以了。
注意,各个矩形间可能重叠。
本题的输入为若干矩形,要求输出其覆盖的总面积。
输入格式
第一行,一个整数n,表示有多少个矩形(1<=n<10000)
接下来的n行,每行有4个整数x1 y1 x2 y2,空格分开,表示矩形的两个对角顶点坐标。
(0<= x1,y1,x2,y2 <=10000)
输出格式
一行一个整数,表示矩形覆盖的总面积面积。
样例输入1
3
1 5 10 10
3 1 20 20
2 7 15 17
样例输出1
340
样例输入2
3
5 2 10 6
2 7 12 10
8 1 15 15
样例输出2
128
解题思路
1、一开始看到题目,很自然想到根据四点计算面积,并依次加上未重合的面积,但是计算过于复杂。后来学习别人的思路,用数组直接将符合要求的点标记,最后计算总共被标记的面积即可,简单粗暴快捷。
2、用面积表示,相当于一个100平方厘米正方形,将其分为10X10的方格,每一方格代表面积即为1平方厘米。因此,被标记小方格个数即为被标记面积。
3、用整型数组内存会过大,所以选择bool数组。
4、另外,网上搜索很多答案后确定,第一个测试用例答案错误,故得分83分。
#include<iostream>
using namespace std;
bool res[10001][10001]={0};
int main()
{
int n;
cin>>n;
int a,b,c,d;
for(int i=0;i<n;i++)
{
cin>>a>>b>>c>>d;
if(a>c)
{
int tmp=a;
a=c;
c=tmp;
}
if(b>d)
{
int tmp=b;
b=d;
d=tmp;
}
for(int p=a;p<c;p++)
{
for(int q=b;q<d;q++)
res[p][q]=1;
}
}
int num=0;
for(int i=0;i<10001;i++)
{
for(int j=0;j<10001;j++)
{
if(res[i][j]==1)
num++;
}
}
cout<<num;
return 0;
}