暑假集训中期测试 Problem D: 装箱问题2 (并查集)

Description

有很多个棱长为1的正方体货物整齐地堆在一堆。不过有一些是悬空的, 大概是粘上去的吧。。。

给出这些货物的相邻关系,求最小的长方体(或正方体)能装下这些货物的集装箱的体积,(集装箱棱长方向与这些正方体三个棱方向平行)。

Input

每组数据第一行一个n,表示有n个货物。1 <= n <= 1000

接下来n行每行6个数,第i行表示以棱方向为轴的x轴正负、y轴正负、z轴正负方向与第i个货物相邻的货物编号(i为1~n),0表示无该位置信息。

Output

如果描述出现矛盾或者无法确定货物是堆在一起的,输出"What?",否则输出集装箱体积。

Sample Input

3
0 0 0 0 3 2
0 0 0 0 1 0
0 0 0 0 0 1

Sample Output

3
 
View Code
#include <stdio.h>
#define N 1005
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define INF 0x3fffffff
int x[N],y[N],z[N];
int p[N];
int n;
void make_set()
{for(int i=1;i<=n;i++)   p[i]=i,x[i]=y[i]=z[i]=0;
}
int find_set(int i)
{int pi=p[i];if(i^p[i])  p[i]=find_set(p[i]);if(pi^p[i]){x[i]+=x[pi];y[i]+=y[pi];z[i]+=z[pi];}return p[i];
}
void union_set(int i,int j,int dir,int d)
{int pi,pj;pi=find_set(i);pj=find_set(j);p[pj]=pi;//dir为0 表示 i与j在x方向上相邻,d=1表示j在i右边if(dir==0){x[pj]=x[i]-x[j]+d;y[pj]=y[i]-y[j];z[pj]=z[i]-z[j];}else if(dir==1){x[pj]=x[i]-x[j];y[pj]=y[i]-y[j]+d;z[pj]=z[i]-z[j];}else{x[pj]=x[i]-x[j];y[pj]=y[i]-y[j];z[pj]=z[i]-z[j]+d;}
}
int main()
{int i,j;bool wa;while(~scanf("%d",&n)){make_set();wa=false;for(i=1;i<=n;i++){for(int dir=0;dir<3;dir++){for(int d=1;d>=-1;d-=2){scanf("%d",&j);if(j==0)    continue;if(find_set(i)^find_set(j)) union_set(i,j,dir,d);else{if(dir==0 && !(y[i]==y[j]&&z[i]==z[j]&&d==x[j]-x[i]))  wa=true;if(dir==1 && !(x[i]==x[j]&&z[i]==z[j]&&d==y[j]-y[i]))  wa=true;if(dir==2 && !(y[i]==y[j]&&x[i]==x[j]&&d==z[j]-z[i]))  wa=true;}}}}for(i=2;!wa && i<=n;i++)   if(find_set(i)!=find_set(1))    wa=true;int minx=INF,maxx=-INF;int miny=INF,maxy=-INF;int minz=INF,maxz=-INF;if(wa)  puts("What?");else{for(int i=1;i<=n;i++){minx=MIN(minx,x[i]);    maxx=MAX(maxx,x[i]);miny=MIN(miny,y[i]);    maxy=MAX(maxy,y[i]);minz=MIN(minz,z[i]);    maxz=MAX(maxz,z[i]);}printf("%d\n",(maxx-minx+1)*(maxy-miny+1)*(maxz-minz+1));}}return 0;
}

 

转载于:https://www.cnblogs.com/algorithms/archive/2012/07/30/2615633.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

s3cmd安装及使用

一、安装 1.下载安装包。 这里我们使用s3cmd-1.0.0.tar.gz安装包 2.解压安装包 tar xzvf s3cmd-1.0.0.tar.gz 3.移动路径 mv s3cmd-1.0.0 /usr/local/s3cmd 4.创建软链接 ln -s /usr/local/s3cmd/s3cmd /usr/bin/s3cmd 5.执行配置命令(按提示输入相应密码等) s3cmd -…

二叉树——堆

二叉树顺序存储结构 理解堆之前先理解一下二叉树的顺序存储结构。普通的二叉树并不适合顺序存储&#xff0c;因为可能会造成大量的空间浪费。只有完全二叉树适合顺序结构存储。显示中我们通常把堆使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统中虚拟进程…

hive函数大全:11大类、109个函数

磨刀不误砍柴工&#xff0c;学完函数再sql 目录 一、关系运算 1. 等值比较: 2. 不等值比较: <> 3.小于比较: < 4. 小于等于比较: < 5. 大于比较: > 6. 大于等于比较: > 7. 空值判断: IS NULL 8. 非空判断: IS NOTNULL 9. LIKE比较: LIKE 10. J…

open AI 在DOTA 5v5 比赛中战胜职业选手

来源&#xff1a;AI科技大本营摘要&#xff1a;去年&#xff0c;OpenAI 在 DOTA 的 1v1 比赛中战胜了职业玩家 Dendi&#xff0c;而在距离进阶版 OpenAI Five 系统战胜人类业余玩家不过一个月的时间&#xff0c;今天凌晨&#xff0c;它又以 2:1 的战绩再次完成对人类高级玩家的…

C/C++程序从源代码到可执行程序的流程

对于一个C/C编写的程序&#xff0c;从源代码到可执行程序的过程通常是由IDE来完成的&#xff0c;一般分为四个步骤&#xff1a;预处理、编译、汇编、链接&#xff0c;下面就来详细说一下这四个步骤。 预处理&#xff1a; 主要是对其中的伪指令和特殊符号进行处理&#xff1a; …

Python 两种装饰器

目录 带参数的装饰器&#xff08;函数&#xff09; 类装饰器 装饰器(Decorators)是 Python 的一个重要部分。简单地说&#xff1a;他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短&#xff0c;也更Pythonic&#xff08;Python范儿&#xff09;。 带参数的装…

如何体现机器智能和群体智能的关系,2018新版互联网大脑模型绘制

作者&#xff1a;刘锋 计算机博士 互联网进化论作者2018年新的这一版&#xff0c;也是互联网大脑模型图的第五个版本&#xff0c;距离第一版的发布已经有10年时间&#xff08;2008年&#xff09;&#xff0c;距离上一版第四版也有1年时间&#xff0c;在这一版中主要解决了如何…

Python可变传参: *args和**kwargs

args是参数的数组&#xff0c;kwargs就是当你传入keyvalue是存储的字典。 请看例子&#xff1a; def test(a,*args,**kwargs): print "a: ",a print "args: ",args print "kwargs: ",kwargs test(1,2,3,d4,e5) 输出结果&#xff1a; a: 1 args: …

7/7 第7篇 函数名与函数指针

第7篇 函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子&#xff1a; //自行包含头文件 void MyFun(int x); //此处的申明也可写成&#xff1a;void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用MyFun(10);函数 return 0; }…

全球互联正在创造一个知识极大丰富和隐私终结的时代

来源&#xff1a;资本实验室摘要&#xff1a;据预测&#xff0c;到2020年&#xff0c;全球物联网连接设备将超过500亿个&#xff0c;会产生600泽字节的信息。这么庞大的数据量&#xff0c;将如何影响并改变我们的生活和工作&#xff1f;聚焦前沿科技创新与传统产业升级据预测&a…

大数据计算引擎:impala对比hive

目录 Impala与Hive的异同 数据存储 元数据 SQL解释处理 执行计划&#xff1a; 数据流&#xff1a; 内存使用&#xff1a; 调度&#xff1a; 容错&#xff1a; 适用面&#xff1a; Impala相对于Hive所使用的优化技术 Impala的优缺点 Impala与Hive的异同 数据存储 …

从外部调用Django模块

import os import sys sys.path.insert(0,/data/cloud_manage) from django.core.management import setup_environ import settings setup_environ(settings)from common.monitor import Monitor from django.db import connection, transaction 前提就是&#xff0c;要新建一…

泡沫破裂之后,强化学习路在何方?

作者&#xff5c;侯宇清、陈玉荣来源&#xff5c;智能单元编辑&#xff5c;Debra一、深度强化学习的泡沫2015 年&#xff0c;DeepMind 的 Volodymyr Mnih 等研究员在《自然》杂志上发表论文 Human-level control through deep reinforcement learning[1]&#xff0c;该论文提出…

常见的设计模式--单例模式

设计模式 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的是为了代码可重用性、让代码更容易被他人理去解、保证代码可靠性。 设计模式使代码编写真正工程化&#xff1b;设计模式是软件工…

一篇文章搞懂数据仓库:维度表(设计原则、设计方法)

目录 1、什么是维度表&#xff1f; 2、维度表设计原则 &#xff08;1&#xff09;维度属性尽量丰富&#xff0c;为数据使用打下基础 &#xff08;2&#xff09;给出详实的、富有意义的文字描述 &#xff08;3&#xff09;区分数值型属性和事实 &#xff08;4&#xff09;…

javascript 键值转换

for (var i 0; i < headerFields.length; i) {fieldToIndex[headerFields[i]] i;} 转载于:https://www.cnblogs.com/EasonSun/archive/2012/08/03/2621661.html

Github项目:AI消除马赛克实战

目录 1、原理 2、准备工作 3、消除马赛克 4、效果对比 1、原理 该算法利用线性盒滤波器分别处理每个块的事实。对于每个块&#xff0c;它将搜索图像中的所有块像素化以检查直接匹配。 对于大多数像素化图像&#xff0c;Depix能够找到单个匹配结果。它假设这些是正确的。然…

C++继承一览

继承的概念及定义 继承机制是面向对象程序设计是代码可以复用的重要手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生的类称为派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体现了由简单到复杂的认知过程。…

人工智能能否复制人脑引争论 美媒:目前AI仍存在局限性

来源&#xff1a;网易智能摘要&#xff1a;人们应用人工智能技术&#xff08;AI&#xff09;的所有领域&#xff0c;包括无人驾驶汽车、机器人医生、超过10亿中国公民的社会信用评分系统等&#xff0c;当前都取决于一场关于如何让AI做其不能做的事的辩论。8月6日报道称&#xf…

Tushare免费获取股票数据:实时数据,历史数据,行情数据

一 操作手册 引导用户顺利开始使用Tushare Pro数据&#xff0c;以下步骤将带您开始Tushare数据之旅&#xff1a; 用户注册登录后可调用数据&#xff1a;https://tushare.pro/register?reg399205 二 如何获取TOKEN凭证 1、登录成功后&#xff0c;点击右上角->个人主页 2、…