一道算法考试题目,求大神提供下思路

zhkchd 2014-12-09 03:32:01
问题描述

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

输入格式

  输入的第一行包含一个整数n,表示要画的矩形的个数。
  接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标
输出格式

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

样例输入

2
1 1 4 4
2 3 6 5

样例输出

15

评测用例规模与约定

  1<=n<=100,0<=横坐标、纵坐标<=100。
...全文
145 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhkchd 2014-12-09
  • 打赏
  • 举报
回复
谢谢各位大神
fly_dragon_fly 2014-12-09
  • 打赏
  • 举报
回复
1) 定义一个数组 char map[100][100], 清零,然后通过坐标填上1,完成之后统计. 2) 我个人比较喜欢这一种,只是代码不如上面直观, 每行的数据用16个字节来存储,每个面积只占1位, 这样定义 int map[100][4] , 或者 __int64 map[100][2], 只需要生成一个填充值,然后按高度或上,最后统计1的结果,统计可以通过查表,或者使用硬件指令完成。
autumn1202 2014-12-09
  • 打赏
  • 举报
回复
1L说的没错 不过考虑到规模变大的情况,想了一种方法: for(each (x1,y1)到(x2,y2)) //假设x1<x2, y1<y2, 如果不是,直接互换 { from x1+1 to x2 { if(rec[i].start == 0) rec[i].start = y1; else if(rec[i].start > y1) rec[i].start = y1; if(rec[i].end== 0) rec[i].end= y2; else if(rec[i].end < y2) rec[i].start = y2; } } 也就是rec[]记录每一列的起始位置跟结束位置 所有矩形输入完毕后根据记录的x最大最小值,循环sum+= rec[i].end - rec[i].start 就ok
FancyMouse 2014-12-09
  • 打赏
  • 举报
回复
扫描线扫一下就行,这个规模甚至线段树都不用维护,直接硬扫描都行

64,633

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧