poj1151 矩形面积并
2013-11-18 16:02
190 查看
解题报告
题目
:http://poj.org/problem?id=1151
题目大意
:给定平面上n个矩阵(n<100)求总面积
算法
:离散化 +
染色
思路
:如果点都是整数,而且矩阵左下角和右上角的点的坐标很小,那么我们可以开一个二维数组area[MAX_X][MAX_Y],然后如果有矩阵(1,1,3,4)我们就将x 1到3,y 1到4标记为1,当有矩阵
(2,3,4,5)那我们在把2到4,3到5标记为1.这样就解决的矩阵间重复的问题。最后看一下area里有几个1.
现在矩阵规模没有改变,但是点的坐标是浮点型而且最大100000,我们把它转化为上面的模型,将点离散化为1,2,3.。。。。。。然后染色。然后看为1的小格area[i][j],那么这个格对应于原来的面积就是(ori[i + 1] – ori[i]) * (ori[j + 1] *
ori[j])
ori[i]表示i对应着的原来浮点型的点。
离散化是注意判重。离散化用map实现就行。
提交情况
:runtime error
1次
Wrong answer 1次
Presentation error 1次
Accepted 1次
经验与收获
:练习了map的同时,学习了矩形面积并的解决方法。
AC code
:
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
#define MAXN 410
struct POINT{
double x, y;
};
struct _Matrix{
POINT left, right;
} matrix[MAXN];
double point[MAXN * 2], ori[MAXN * 2];
map<double,int> Pt;
map<double,int>::iterator it;
bool area[MAXN][MAXN];
bool comp(const double &A, const double &B){
return A < B;
}
int main(){
int n, i, j, k, m, key, CASE = 0;
while(~scanf("%d", &n), n){
m = 0;
for(i = 0; i < n; i ++){
scanf("%lf %lf %lf %lf", &matrix[i].left.x, &matrix[i].left.y, &matrix[i].right.x, &matrix[i].right.y);
point[m ++] = matrix[i].left.x;
point[m ++] = matrix[i].left.y;
point[m ++] = matrix[i].right.x;
point[m ++] = matrix[i].right.y;
}
sort(point, point + m, comp);
key = 1;
Pt[point[0]] = key;
ori[key] = point[0];
for(i = 1; i < m; i ++){
if(point[i] != point[i - 1]){
Pt[point[i]] = ++key;
ori[key] = point[i];
}
}
memset(area, 0, sizeof(area));
for(i = 0; i < n; i ++){
for(j = Pt[matrix[i].left.x]; j < Pt[matrix[i].right.x]; j ++)
for(k = Pt[matrix[i].left.y]; k < Pt[matrix[i].right.y]; k ++)
area[j][k] = 1;
}
double ans = 0;
for(i = 1; i <= key; i ++)
for(j = 1; j <= key; j ++)
if(area[i][j]){
ans += (ori[i + 1] - ori[i]) * (ori[j + 1] - ori[j]);
}
printf("Test case #%d\n", ++CASE);
printf("Total explored area: %.2lf\n\n", ans);
}
return 0;
}
题目
:http://poj.org/problem?id=1151
题目大意
:给定平面上n个矩阵(n<100)求总面积
算法
:离散化 +
染色
思路
:如果点都是整数,而且矩阵左下角和右上角的点的坐标很小,那么我们可以开一个二维数组area[MAX_X][MAX_Y],然后如果有矩阵(1,1,3,4)我们就将x 1到3,y 1到4标记为1,当有矩阵
(2,3,4,5)那我们在把2到4,3到5标记为1.这样就解决的矩阵间重复的问题。最后看一下area里有几个1.
现在矩阵规模没有改变,但是点的坐标是浮点型而且最大100000,我们把它转化为上面的模型,将点离散化为1,2,3.。。。。。。然后染色。然后看为1的小格area[i][j],那么这个格对应于原来的面积就是(ori[i + 1] – ori[i]) * (ori[j + 1] *
ori[j])
ori[i]表示i对应着的原来浮点型的点。
离散化是注意判重。离散化用map实现就行。
提交情况
:runtime error
1次
Wrong answer 1次
Presentation error 1次
Accepted 1次
经验与收获
:练习了map的同时,学习了矩形面积并的解决方法。
AC code
:
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
#define MAXN 410
struct POINT{
double x, y;
};
struct _Matrix{
POINT left, right;
} matrix[MAXN];
double point[MAXN * 2], ori[MAXN * 2];
map<double,int> Pt;
map<double,int>::iterator it;
bool area[MAXN][MAXN];
bool comp(const double &A, const double &B){
return A < B;
}
int main(){
int n, i, j, k, m, key, CASE = 0;
while(~scanf("%d", &n), n){
m = 0;
for(i = 0; i < n; i ++){
scanf("%lf %lf %lf %lf", &matrix[i].left.x, &matrix[i].left.y, &matrix[i].right.x, &matrix[i].right.y);
point[m ++] = matrix[i].left.x;
point[m ++] = matrix[i].left.y;
point[m ++] = matrix[i].right.x;
point[m ++] = matrix[i].right.y;
}
sort(point, point + m, comp);
key = 1;
Pt[point[0]] = key;
ori[key] = point[0];
for(i = 1; i < m; i ++){
if(point[i] != point[i - 1]){
Pt[point[i]] = ++key;
ori[key] = point[i];
}
}
memset(area, 0, sizeof(area));
for(i = 0; i < n; i ++){
for(j = Pt[matrix[i].left.x]; j < Pt[matrix[i].right.x]; j ++)
for(k = Pt[matrix[i].left.y]; k < Pt[matrix[i].right.y]; k ++)
area[j][k] = 1;
}
double ans = 0;
for(i = 1; i <= key; i ++)
for(j = 1; j <= key; j ++)
if(area[i][j]){
ans += (ori[i + 1] - ori[i]) * (ori[j + 1] - ori[j]);
}
printf("Test case #%d\n", ++CASE);
printf("Total explored area: %.2lf\n\n", ans);
}
return 0;
}
相关文章推荐
- poj1149&nbsp;最大流
- poj2679&nbsp;&nbsp;最短路+受负环影响点的判…
- 用户增加,功能扩展时系统如何升级 架构改变
- Android开发之--Auto Complete TextView的使用
- Excel中设置下拉列表的来源怎么选择其他工作表的内容
- 需要整理的
- 6个常见的 PHP 安全性攻击
- Data Domain和Avamar到底有什么不同呢?
- html_day3---表单元素
- JAVA 学习笔记一
- dedecms 全局标签 使用
- poj1180&nbsp;dp斜率优化
- hdu3507&nbsp;动态规划+斜率优化
- hdu2971&nbsp;递推+矩阵快速幂
- poj1042&nbsp;动态规划
- hdu3335&nbsp;有向图最少路径覆盖
- poj2942&nbsp;点双连通分量
- poj3352,3177
- poj3613&nbsp;过K条边最短路&nbsp;floyed
- poj1236&nbsp;强联通分量(tarjan)