码迷,mamicode.com
首页 > 其他好文 > 详细

uva 12171 hdu 1771 Sculpture

时间:2015-04-24 06:43:54      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

//这题从十一点开始写了四十分钟 然后差错一小时+ 要吐了

这题题意是给很多矩形的左下角(x,y,z最小的那个角)和三边的长(不是x,y,z最大的那个角T-T),为组成图形的面积与表面积(包在内部的之算体积不算表面积)

解法:离散化+bfs,先把范围扩大(相当于在周围加上空气),然后bfs,遇到表面积直接加入,遇到非长方体的部分也直接加入,最后用总体积减去空气的体积,这样就可以把内部的体积计算进来而不计算其表面积。因为坐标范围比较大,要先离散化。

//其实我对这题一直耿耿于怀,当年没进省队多少与这题有关

//昨天没出题 明天周五课少 出两题

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<queue>
  8 #include<vector>
  9 #include<map>
 10 #include<stack>
 11 #include<string>
 12 
 13 using namespace std;
 14 
 15 const int u[6]={0,0,0,0,1,-1};
 16 const int v[6]={1,-1,0,0,0,0};
 17 const int w[6]={0,0,1,-1,0,0};
 18 
 19 struct rec{
 20     int x1,y1,z1,x2,y2,z2;
 21 };
 22 
 23 struct POINT{
 24     int x,y,z;
 25 };
 26 
 27 bool vis[103][103][103];
 28 bool loc[103][103][103];
 29 int n,T,ans1,ans2;
 30 int x[103],y[103],z[103];
 31 rec p[103];
 32 int numx,numy,numz;
 33 
 34 int IDX(int aim){
 35     return lower_bound(x,x+numx,aim)-x;
 36 }
 37 
 38 int IDY(int aim){
 39     return lower_bound(y,y+numy,aim)-y;
 40 }
 41 
 42 int IDZ(int aim){
 43     return lower_bound(z,z+numz,aim)-z;
 44 }
 45 
 46 int solve(int flag,int nowx,int nowy,int nowz){//计算表面积
 47     if (flag==0) return (x[nowx+1]-x[nowx])*(z[nowz+1]-z[nowz]);
 48     if (flag==1) return (x[nowx+1]-x[nowx])*(z[nowz+1]-z[nowz]);
 49     if (flag==2) return (x[nowx+1]-x[nowx])*(y[nowy+1]-y[nowy]);
 50     if (flag==3) return (x[nowx+1]-x[nowx])*(y[nowy+1]-y[nowy]);
 51     if (flag==4) return (z[nowz+1]-z[nowz])*(y[nowy+1]-y[nowy]);
 52     if (flag==5) return (z[nowz+1]-z[nowz])*(y[nowy+1]-y[nowy]);
 53     return -1;
 54 }
 55 
 56 void bfs(){
 57     queue<POINT> q;
 58     while (!q.empty()) q.pop();
 59     q.push((POINT){0,0,0});
 60     ans2=(x[1]-x[0])*(y[1]-y[0])*(z[1]-z[0]);
 61     vis[0][0][0]=1;
 62     while (!q.empty()){
 63             POINT now=q.front();
 64             q.pop();
 65             for (int i=0;i<6;i++){
 66                     int tx=now.x+u[i];
 67                     int ty=now.y+v[i];
 68                     int tz=now.z+w[i];
 69                     if (tx<0 || tx>=numx-1 || ty<0 || ty>=numy-1 || tz<0 || tz>=numz-1 || vis[tx][ty][tz]) continue;
 70                     if (loc[tx][ty][tz]){
 71                             ans1+=solve(i,now.x,now.y,now.z);
 72                     }
 73                     else{
 74                             ans2+=(x[tx+1]-x[tx])*(y[ty+1]-y[ty])*(z[tz+1]-z[tz]);
 75                             vis[tx][ty][tz]=1;
 76                             q.push((POINT){tx,ty,tz});
 77                     }
 78             }
 79     }
 80 }
 81 
 82 int main(){
 83     scanf("%d",&T);
 84     for (int cas=1;cas<=T;cas++){
 85             scanf("%d",&n);
 86             for (int i=0;i<n;i++){
 87                     scanf("%d%d%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].z1,&p[i].x2,&p[i].y2,&p[i].z2);
 88                     p[i].x2+=p[i].x1;
 89                     p[i].y2+=p[i].y1;
 90                     p[i].z2+=p[i].z1;
 91                     x[2*i+1]=p[i].x1;
 92                     x[2*i+2]=p[i].x2;
 93                     y[2*i+1]=p[i].y1;
 94                     y[2*i+2]=p[i].y2;
 95                     z[2*i+1]=p[i].z1;
 96                     z[2*i+2]=p[i].z2;//先把坐算出来
 97             }
 98             x[0]=0;
 99             y[0]=0;
100             z[0]=0;
101             x[2*n+1]=1001;
102             y[2*n+1]=1001;
103             z[2*n+1]=1001;//拓展范围
104             sort(x,x+2*n+2);
105             sort(y,y+2*n+2);
106             sort(z,z+2*n+2);
107             numx=unique(x,x+2*n+2)-x;
108             numy=unique(y,y+2*n+2)-y;
109             numz=unique(z,z+2*n+2)-z;//离散化
110             memset(loc,0,sizeof(loc));
111             memset(vis,0,sizeof(vis));
112             for (int now=0;now<n;now++){
113                     for (int i=IDX(p[now].x1);i<IDX(p[now].x2);i++){
114                             for (int j=IDY(p[now].y1);j<IDY(p[now].y2);j++){
115                                     for (int k=IDZ(p[now].z1);k<IDZ(p[now].z2);k++){
116                                         loc[i][j][k]=1;//记录矩形位置
117                                     }
118                             }
119                     }
120             }
121             ans1=0;//^2
122             ans2=0;//^3
123             bfs();
124             ans2=x[numx-1]*y[numy-1]*z[numz-1]-ans2;//总体积减去空气体积
125             printf("%d %d\n",ans1,ans2);
126     }
127     return 0;
128 }
129 /*
130 1
131 2
132 1 2 3 3 4 5
133 6 2 3 3 4 5
134 
135 1
136 7
137 1 1 1 5 5 1
138 1 1 10 5 5 1
139 1 1 2 1 4 8
140 2 1 2 4 1 8
141 5 2 2 1 4 8
142 1 5 2 4 1 8
143 3 3 4 1 1 1
144 
145 2
146 2
147 1 2 3 3 4 5
148 6 2 3 3 4 5
149 7
150 1 1 1 5 5 1
151 1 1 10 5 5 1
152 1 1 2 1 4 8
153 2 1 2 4 1 8
154 5 2 2 1 4 8
155 1 5 2 4 1 8
156 3 3 4 1 1 1
157 */

 

uva 12171 hdu 1771 Sculpture

标签:

原文地址:http://www.cnblogs.com/baby-mouse/p/4452298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!