问题描述
试题编号: | 201409-2 |
试题名称: | 画图 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。 输入格式 输入的第一行包含一个整数n,表示要画的矩形的个数。 输出格式 输出一个整数,表示有多少个单位的面积被涂上颜色。 样例输入 2 样例输出 15 评测用例规模与约定 1<=n<=100,0<=横坐标、纵坐标<=100。 |
本题很简单,开个二维数组就可以了。之所以记录一下是因为开始的时候想错了一个点。因为给出的是坐标,要求的是着色区域,所以需要转换一下。我最开始的思路是把坐标范围内的所有位置标记,然后根据左下角坐标以及他的右 上 右上共四个坐标位置是否均被标记。但是这个会出问题,就是比如我们给出的坐标范围是(1,1)(2,2) (2,1)(3,2) (1,2)(2,3) (3,2)(4,3) 那么(2,2)(3,2)(2,3)(3,3)四个点都会被标记,然而这四个点对应的小块并没有被着色。本来还想着要不想做标记的时候用相同变量标记,这样就可以确定一个块的四个坐标位置是不是真的被标记了,但是这样重复的部分就不好处理了。后来发现我们每次只要标记左下角的点来代表一个小块,然后数左下角坐标就行了。问题解决。
代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int mat[101][101]={0};
int main()
{
int n;
cin>>n;
int a,b,c,d;
for(int i=0;i<n;++i)
{
cin>>a>>b>>c>>d;
for(int j=a;j<=c-1;++j)
{
for(int k=b;k<=d-1;++k)
{
mat[j][k]=1;
}
}
}
int count=0;
for(int i=0;i<=99;++i)
{
for(int j=0;j<=99;++j)
{
if(mat[i][j]==1)
count++;
}
}
cout<<count;
return 0;
}