无耻的粘贴一篇

第一次纯粹窃取别人成果是应为一开始就没有思路,然后看了别人的思路不知道怎么表述,然后就直接看了代码ORZ
#include
#include
#include
#include

using namespace std;

const int MAXN = 55;
const int MAXC = 1001;

int dx[] = {-1,1,0,0,0,0};
int dy[] = {0,0,-1,1,0,0};
int dz[] = {0,0,0,0,-1,1};

struct point{
    int x,y,z;
    point(int xx,int yy, int zz):x(xx),y(yy),z(zz){}
};
int T,N;
int s,v;
int nx,ny,nz;
int xx0[MAXN],xx1[MAXN],yy0[MAXN],yy1[MAXN],z0[MAXN],z1[MAXN];
int xs[MAXN<<2],ys[MAXN<<2],zs[MAXN<<2];
int color[MAXN<<2][MAXN<<2][MAXN<<2];

void init()
{
    nx = ny = nz = v = s = 0;
    memset(color,0,sizeof(color));
}

int area(int x,int y,int z,int dir)
{
    if(dx[dir] != 0)
        return (ys[y+1] - ys[y]) * (zs[z+1] - zs[z]);
    else if(dy[dir] != 0)
        return (xs[x+1] - xs[x]) * (zs[z+1] - zs[z]);
    else
        return (xs[x+1] - xs[x]) * (ys[y+1] - ys[y]);
}

void bfs()
{
    queue Q;
    Q.push(point(0,0,0));
    color[0][0][0] = 2;
    while(!Q.empty()){
        point t = Q.front();Q.pop();
        printf("%d %d\n",s,v);
        v += (xs[t.x + 1] - xs[t.x]) * (ys[t.y + 1] - ys[t.y]) * (zs[t.z + 1] - zs[t.z]);
        for(int i = 0; i < 6; ++i){
            int x = t.x + dx[i], y = t.y + dy[i], z = t.z + dz[i];
            if(x >= 0 && x < nx -1 && y >= 0 && y < ny -1 && z >= 0 && z < nz - 1){
                if(color[x][y][z] == 1) s += area(x,y,z,i);
                else if(color[x][y][z] == 0){
                    color[x][y][z] = 2;
                    Q.push(point(x,y,z));
                }
            }
        }
    }
    v = MAXC * MAXC * MAXC - v;
}

int main(void)
{
    //freopen("input.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d", &T);
    while(T--){
        scanf("%d", &N);
        init();
        xs[nx++] = 0;   ys[ny++] = 0;   zs[nz++] = 0;
        xs[nx++] = MAXC;ys[ny++] = MAXC;zs[nz++] = MAXC;
        for(int i = 0; i < N; ++i){
            scanf("%d %d %d %d %d %d",&xx0[i],&yy0[i],&z0[i],&xx1[i],&yy1[i],&z1[i]);
            xx1[i] += xx0[i];yy1[i] += yy0[i];z1[i] += z0[i];
            xs[nx++] = xx0[i];xs[nx++] = xx1[i];
            ys[ny++] = yy0[i];ys[ny++] = yy1[i];
            zs[nz++] = z0[i];zs[nz++] = z1[i];
        }
        sort(xs,xs + nx);
        sort(ys,ys + ny);
        sort(zs,zs + nz);
        nx = unique(xs,xs + nx) - xs;
        ny = unique(ys,ys + ny) - ys;
        nz = unique(zs,zs + nz) - zs;
        for(int i = 0; i < N; ++i){
            int X0 = lower_bound(xs,xs + nx,xx0[i]) - xs;
            int X1 = lower_bound(xs,xs + nx,xx1[i]) - xs;
            int Y0 = lower_bound(ys,ys + ny,yy0[i]) - ys;
            int Y1 = lower_bound(ys,ys + ny,yy1[i]) - ys;
            int Z0 = lower_bound(zs,zs + nz,z0[i]) - zs;
            int Z1 = lower_bound(zs,zs + nz,z1[i]) - zs;
            for(int x = X0; x < X1; ++x)
                for(int y = Y0; y < Y1; ++y)
                    for(int z = Z0; z < Z1; ++z)
                        color[x][y][z] = 1;
        }
        bfs();
        printf("%d %d\n",s,v);
    }
    return 0;
}
思路对于熟练的人来说应该挺简单的离散化,标记,队列或者递归进行统计如果是体积就直接先求联通的空气的体积,表面积就直接对剥皮进行统计哎!加油训练老看别人代码不好!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值