Uva 12171 Sculpture - 离散化 + floodfill
题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3323
题意:
三维空间中有n个长方体组成的雕塑,求表面积和体积。
分析:
因为长方体块可能在中间包围空气(也计入长方体体积),直接计算长方体体积是比较困难的,但是我们可以计算空气的体积,然后用总体积减去空气体积得出长方体的总体积。
这道题网上很多答案是模糊不清并且提交上去是错误的。
解这道题的关键是离散化后坐标的处理。在建立好离散坐标系后,利用离散坐标系在原坐标系中绘制长方体区域块,然后floodfill离散坐标系,初始点为(0,0,0)
注意这里的关键,floodfill处理的是离散坐标系! 比如离散坐标(0,0,0),他是原始坐标也是(0,0,0) 为原点, 长方体第一个顶点的原始坐标为(2,4,6),处理后的离散坐标可能是(1,1,1)也可能是(1,1,2)等,这个不要紧,bfs时判断其是不是长方体的顶点原始坐标(看看该离散坐标对应的原始坐标区域有无被标记)就好了,然后累加空气块体积和长方体的表面积即可。
附上一份网络上个人认为写得比较好的的参考代码:
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std; const int maxn = + ;
const int maxc = + ; int n, x0[maxn], y0[maxn], z0[maxn], x1[maxn], y1[maxn], z1[maxn]; int nx, ny, nz;
int xs[maxn*], ys[maxn*], zs[maxn*]; const int dx[] = {,-,,,,};
const int dy[] = {,,,-,,};
const int dz[] = {,,,,,-};
int color[maxn*][maxn*][maxn*]; struct Cell
{
int x, y, z;
Cell(int x=, int y=, int z=):x(x), y(y), z(z) {}
bool valid() const { return x >= && x < nx- && y >= && y < ny- && z >= && z < nz-;}
bool solid() const { return color[x][y][z] == ; }
bool getVis() const { return color[x][y][z] == ; }
void setVis() const { color[x][y][z] = ; }
Cell neighbor(int dir) const
{ return Cell(x+dx[dir], y+dy[dir], z+dz[dir]); }
int volume()
{ return (xs[x+]-xs[x]) * (ys[y+]-ys[y]) * (zs[z+]-zs[z]); }
int area(int dir)
{
if(dx[dir]) return (ys[y+]-ys[y]) * (zs[z+]-zs[z]);
if(dy[dir]) return (xs[x+]-xs[x]) * (zs[z+]-zs[z]);
return (xs[x+]-xs[x]) * (ys[y+]-ys[y]);
}
}; void discrectize(int* x, int& n)
{
sort(x, x + n);
n = unique(x, x + n) - x;
} int ID(int* x, int n, int x0)
{
return lower_bound(x, x + n, x0) - x;
} void floodfill(int& v, int& s)
{
v = s = ;
Cell c;
c.setVis();
queue<Cell> q;
q.push(c);
while(!q.empty())
{
Cell c = q.front(); q.pop();
v += c.volume();
for(int i = ; i < ; ++i)
{
Cell c2 = c.neighbor(i);
if(!c2.valid()) continue;
if(c2.solid()) s += c.area(i);
else if(!c2.getVis())
{
c2.setVis();
q.push(c2);
}
}
}
v = maxc*maxc*maxc - v;
} int main()
{
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--)
{
memset(color, , sizeof(color));
nx = ny = nz = ;
xs[] = ys[] = zs[] = ;
xs[] = ys[] = zs[] = maxc;
scanf("%d", &n);
for(int i = ; i < n; ++i)
{
scanf("%d%d%d%d%d%d", &x0[i], &y0[i], &z0[i], &x1[i], &y1[i], &z1[i]);
x1[i] += x0[i]; y1[i] += y0[i]; z1[i] += z0[i];
xs[nx++] = x0[i]; xs[nx++] = x1[i];
ys[ny++] = y0[i]; ys[ny++] = y1[i];
zs[nz++] = z0[i]; zs[nz++] = z1[i];
}
discrectize(xs, nx);
discrectize(ys, ny);
discrectize(zs, nz); for(int i = ; i < n; ++i)
{
int X1 = ID(xs, nx, x0[i]), X2 = ID(xs, nx, x1[i]);
int Y1 = ID(ys, ny, y0[i]), Y2 = ID(ys, ny, y1[i]);
int Z1 = ID(zs, nz, z0[i]), Z2 = ID(zs, nz, z1[i]);
for(int X = X1; X < X2; X++)
for(int Y = Y1; Y < Y2; ++Y)
for(int Z = Z1; Z < Z2; ++Z)
color[X][Y][Z] = ;
} int v, s;
floodfill(v, s);
printf("%d %d\n", s, v);
} return ;
}
Uva 12171 Sculpture - 离散化 + floodfill的更多相关文章
- hdu 2771(uva 12171) Sculpture bfs+离散化
题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...
- UVa Sculpture(离散化 floodfill)
题意: 给定n个立方体的一个顶点坐标和3边长度, 问这些立方体组成的雕塑的表面积和体积, 坐标都是整数,n最大为50, 最大为500, 边长最大也是500. 分析: 继UVa221后又一道离散 ...
- UVA 12171 Sculpture
https://vjudge.net/problem/UVA-12171 题目 某人设计雕塑,用的是很扯的方法:把一堆长方体拼起来.给出长方体的坐标和长宽高,求外表面积.因为要将这雕塑进行酸洗,需要知 ...
- UVa 12171 (离散化 floodfill) Sculpture
题意: 三维空间中有n个长方体组成的雕塑,求表面积和体积. 分析: 我们可以在最外边加一圈“空气”,然后求空气的连通块的体积,最后用总体积减去即是雕塑的体积. 还有一个很“严重”的问题就是5003所占 ...
- UVA 12171 (hdu 2771)sculptrue(离散化)
以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...
- uva 12171 hdu 1771 Sculpture
//这题从十一点开始写了四十分钟 然后查错一小时+ 要吐了 这题题意是给很多矩形的左下角(x,y,z最小的那个角)和三边的长(不是x,y,z最大的那个角T-T),为组成图形的面积与表面积(包在内部的之 ...
- UVA12171-Sculpture(离散化+floodfill)
Problem UVA12171-Sculpture Accept: 196 Submit: 1152 Time Limit: 3000 mSec Problem Description Imagi ...
- UVa 221 (STL 离散化) Urban Elevations
题意: 作图为n个建筑物的俯视图,右图为从南向北看的正视图,按从左往右的顺序输出可见建筑物的标号. 分析: 题中已经说了,要么x相同,要么x相差足够大,不会出现精度问题. 给这n个建筑物从左往右排序, ...
- Unique Snowflakes UVA - 11572 (离散化+尺取法)
Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devised a ...
随机推荐
- Heroku登录失败
Heoku 在国内,注册和登录是个大问题,不知道原来怎么注册上了,如今需要登录删除 app 就是删除不了.. 今天努力找了个vpn ,无奈还是登录不成功.https://id.heroku.com/l ...
- [C#]如何访问及调用类中私有成员及方法
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- Java学习笔记9---类静态成员变量的存储位置及JVM的内存划分
笔记8提到了类静态成员变量的访问方式,但静态成员变量存储在哪里呢?在网上查阅不少资料,发现好多内容都是过时的了,其中主流观点是静态成员变量存放在方法区.JDK8之前,静态成员变量确实存放在方法区:但J ...
- 简易 bokeh 图像散景效果算法实现
bokeh百度百科的解释 摄影镜头光圈大小和拍摄距离决定了拍摄时的景深,相对于焦点位置,焦点前与焦点后的被拍摄物体会显得模糊,这个模糊区域被称为焦外.焦外具体的模糊程度还受到镜头中镜片单体和组合的物理 ...
- Modelsim独立仿真Vivado Clocking Wizard IP Core
工欲善其事,必先利其器.在使用Vivado自带的仿真软件仿真的时候,相对于更优秀的仿真工具Modelsim,效率低了很多,为了更高效的开发,我尝试着用Vivado级联Modelsim仿真,但是级联后还 ...
- Haproxy配置文件(2)
#/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -st `cat /var/run/haproxy.pid` ################ ...
- 《跟我学IDEA》六、插件(编码利器)
idea的另一个可爱之处,就是它的强大的插件,下面我以CodeGlance插件为例,这个可以快速定位代码. 第一节:安装插件 ● All plugins 显示所有插件. ● Enabled 显示当前所 ...
- AbstractQueuedSynchronizer的简单分析
说明:本作者是文章的原创作者,转载请注明出处:本文地址:http://www.cnblogs.com/qm-article/p/7955781.html 一.AbstractQueuedSynchro ...
- HDU2988-Dark roads,HDU1233-还是畅通工程-最小生成树
最小生成树: 中文名 最小生成树 外文名 Minimum Spanning Tree,MST 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的 ...
- UVA10341-Solve It-二分查找
二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序 ...