csp 201409-2 画图(含解析思路)

题目描述

    在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
    下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。
csp 201409-2 画图(含解析思路)_第1张图片
给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

 

输入

输入的第一行包含一个整数n,表示要画的矩形的个数。
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
限制:
1<=n<=100,0<=横坐标、纵坐标<=100。

输入样例:

2
1 1 4 4
2 3 6 5

 

输出

输出一个整数,表示有多少个单位的面积被涂上颜色。

样例输出(上例的输出):

15

 

思路

1.既然输入的数据范围不大,那么就定义一个行和列都为0-100的数组,即代码中的arr[101][101]。
2.对于输入的坐标,转换到二维数组中,将矩形范围内的数字置为1。
3.最后计算二维数组中数据之和即可。

 

C++代码

#include 

using namespace std;

int main(int argc, char** argv) {
     
	int arr[101][101]={
     0};
	int n;
	scanf("%d",&n);
	int color[n][4];
	for(int i=0;i<n;i++){
     
		for(int j=0;j<4;j++){
     
			scanf("%d",&color[i][j]);
		}
	}

	for(int i=0;i<n;i++){
     
		int x1=color[i][0];
		int y1=color[i][1];
		int x2=color[i][2];
		int y2=color[i][3];
		for(int p=100-y2+1;p<=100-y1;p++){
     //根据坐标找到数组中矩形行的范围
			for(int q=x1;q<=x2-1;q++){
     //根据坐标找到数组中矩形列的范围
				arr[p][q]=1;
			}
		}
	}
	
	int sum=0;
	for(int i=0;i<101;i++){
     
		for(int j=0;j<101;j++){
     
			sum+=arr[i][j];
		}
	}
	printf("%d",sum);
	
	return 0;
}

其实二维数组中坐标不进行转换也是可以的,直接运用坐标即可。
直接使用坐标,矩形的相对位置不变,那么重叠的面积大小就不变,进而总面积不变。

 

你可能感兴趣的:(算法和数据结构)