当前位置: 首页 > 编程日记 > 正文

POJ1022 Packing Unit 4D Cubes

题目来源:http://poj.org/problem?id=1022

题目大意:

有一些4维的单位体积的立方体盒子,每个立方体有8个面。要用一个大的4为盒子将它们包起来,求最小的大盒子体积。

输入:第一行为测试用例数。每个用例的第一行为单位立方体数目n。接下来的n行每行为一个立方体的信息。每行第一个数字为还立方体的编号,接下来的8个整数分别为对应面相邻的立方体的编号。该面没有邻居则为0.(给出的都是单一刚体。)

输出:最小的能把这个由小4D立方体拼起来的形状的盒子的体积。


Sample Input

1
9
1 2 3 4 5 6 7 8 9
2 0 1 0 0 0 0 0 0
3 1 0 0 0 0 0 0 0
4 0 0 0 1 0 0 0 0
5 0 0 1 0 0 0 0 0
6 0 0 0 0 0 1 0 0
7 0 0 0 0 1 0 0 0
8 0 0 0 0 0 0 0 1
9 0 0 0 0 0 0 1 0

Sample Output

81

本题题干描述得很复杂,想象起来也有一些抽象,其实很简单,跟3D的情况联系起来想就可以了。3D求包围盒的方法推广至4D即可。

  1 //
  2 //        POJ1022 Packing Unit 4D Cubes
  3 //        Memory: 300K        Time: 16MS
  4 //        Language: C++        Result: Accepted
  5 //
  6 
  7 #include <iostream>
  8 #include <vector>
  9 #include <map>
 10 
 11 using namespace std;
 12 
 13 class Cube {
 14 public:
 15     int x1p, x1n, x2p, x2n, x3p, x3n, x4p, x4n;
 16 };
 17 class Pos {
 18 public:
 19     int id;
 20     int x1, x2, x3, x4;
 21 };
 22 
 23 int main() {
 24     int ncase;
 25     cin >> ncase;
 26     for (int caseNo = 1; caseNo <= ncase; ++caseNo) {
 27         int n;
 28         map<int, Cube> cubes;
 29         cin >> n;
 30         for (int i = 1; i <= n; ++i) {
 31             int id;
 32             cin >> id;
 33             Cube cube;
 34             cin >> cube.x1p >> cube.x1n >> cube.x2p >> cube.x2n
 35                 >> cube.x3p >> cube.x3n >> cube.x4p >> cube.x4n;
 36             cubes[id] = cube;
 37         }
 38         bool ok = true;
 39         vector<Pos> solid;
 40         Pos firstPos;
 41         firstPos.id = (*cubes.begin()).first;
 42         firstPos.x1 = firstPos.x2 = firstPos.x3 = firstPos.x4 = 0;
 43         solid.push_back(firstPos);
 44         for (map<int, Cube>::iterator itc = cubes.begin(); itc != cubes.end(); ++itc) {
 45             Cube cube1;
 46             int id = (*itc).first;
 47             int x1p = (*itc).second.x1p;
 48             //x1p
 49             if (x1p != 0) {
 50                 if (cubes[x1p].x1n != id) {
 51                     ok = false;
 52                     break;
 53                 }
 54                 bool f = true;
 55                 Pos pos;
 56                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
 57                     if (f == false) break;
 58                     if ((*its).id == id) {
 59                         pos.id = x1p;
 60                         pos.x1 = (*its).x1 + 1;
 61                         pos.x2 = (*its).x2;
 62                         pos.x3 = (*its).x3;
 63                         pos.x4 = (*its).x4;
 64                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
 65                             if ((*itr).id == x1p) {
 66                                 f = false;
 67                                 break;
 68                             }
 69                         }
 70                     }
 71                 }
 72                 if (f == true) { 
 73                     solid.push_back(pos);
 74                 }
 75             }
 76 
 77             //x1n
 78             int x1n = (*itc).second.x1n;
 79             if (x1n != 0) {
 80                 if (cubes[x1n].x1p != id) {
 81                     ok = false;
 82                     break;
 83                 }
 84                 bool f = true;
 85                 Pos pos;
 86                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
 87                     if (f == false) break;
 88                     if ((*its).id == id) {
 89                         pos.id = x1n;
 90                         pos.x1 = (*its).x1 - 1;
 91                         pos.x2 = (*its).x2;
 92                         pos.x3 = (*its).x3;
 93                         pos.x4 = (*its).x4;
 94                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
 95                             if ((*itr).id == x1n) {
 96                                 f = false;
 97                                 break;
 98                             }
 99                         }
100                     }
101                 }
102                 if (f == true) { 
103                     solid.push_back(pos);
104                 }
105             }
106 
107             //x2p
108             int x2p = (*itc).second.x2p;
109             if (x2p != 0) {
110                 if (cubes[x2p].x2n != id) {
111                     ok = false;
112                     break;
113                 }
114                 bool f = true;
115                 Pos pos;
116                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
117                     if (f == false) break;
118                     if ((*its).id == id) {
119                         pos.id = x2p;
120                         pos.x1 = (*its).x1;
121                         pos.x2 = (*its).x2 + 1;
122                         pos.x3 = (*its).x3;
123                         pos.x4 = (*its).x4;
124                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
125                             if ((*itr).id == x2p) {
126                                 f = false;
127                                 break;
128                             }
129                         }
130                     }
131                 }
132                 if (f == true) { 
133                     solid.push_back(pos);
134                 }
135             }
136             //x2n
137             int x2n = (*itc).second.x2n;
138             if (x2n != 0) {
139                 if (cubes[x2n].x2p != id) {
140                     ok = false;
141                     break;
142                 }
143                 bool f = true;
144                 Pos pos;
145                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
146                     if (f == false) break;
147                     if ((*its).id == id) {
148                         pos.id = x2n;
149                         pos.x1 = (*its).x1;
150                         pos.x2 = (*its).x2 - 1;
151                         pos.x3 = (*its).x3;
152                         pos.x4 = (*its).x4;
153                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
154                             if ((*itr).id == x2n) {
155                                 f = false;
156                                 break;
157                             }
158                         }
159                     }
160                 }
161                 if (f == true) { 
162                     solid.push_back(pos);
163                 }
164             }
165 
166             //x3p
167             int x3p = (*itc).second.x3p;
168             if (x3p != 0) {
169                 if (cubes[x3p].x3n != id) {
170                     ok = false;
171                     break;
172                 }
173                 bool f = true;
174                 Pos pos;
175                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
176                     if (f == false) break;
177                     if ((*its).id == id) {
178                         pos.id = x3p;
179                         pos.x1 = (*its).x1;
180                         pos.x2 = (*its).x2;
181                         pos.x3 = (*its).x3 + 1;
182                         pos.x4 = (*its).x4;
183                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
184                             if ((*itr).id == x3p) {
185                                 f = false;
186                                 break;
187                             }
188                         }
189                     }
190                 }
191                 if (f == true) { 
192                     solid.push_back(pos);
193                 }
194             }
195             //x3n
196             int x3n = (*itc).second.x3n;;
197             if (x3n != 0) {
198                 if (cubes[x3n].x3p != id) {
199                     ok = false;
200                     break;
201                 }
202                 bool f = true;
203                 Pos pos;
204                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
205                     if (f == false) break;
206                     if ((*its).id == id) {
207                         pos.id = x3n;
208                         pos.x1 = (*its).x1;
209                         pos.x2 = (*its).x2;
210                         pos.x3 = (*its).x3 - 1;
211                         pos.x4 = (*its).x4;
212                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
213                             if ((*itr).id == x3n) {
214                                 f = false;
215                                 break;
216                             }
217                         }
218                     }
219                 }
220                 if (f == true) { 
221                     solid.push_back(pos);
222                 }
223             }
224             //x4p
225             int x4p = (*itc).second.x4p;
226             if (x4p != 0) {
227                 if (cubes[x4p].x4n != id) {
228                     ok = false;
229                     break;
230                 }
231                 bool f = true;
232                 Pos pos;
233                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
234                     if (f == false) break;
235                     if ((*its).id == id) {
236                         pos.id = x4p;
237                         pos.x1 = (*its).x1;
238                         pos.x2 = (*its).x2;
239                         pos.x3 = (*its).x3;
240                         pos.x4 = (*its).x4 + 1;
241                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
242                             if ((*itr).id == x4p) {
243                                 f = false;
244                                 break;
245                             }
246                         }
247                     }
248                 }
249                 if (f == true) { 
250                     solid.push_back(pos);
251                 }
252             }
253             //x4n
254             int x4n = (*itc).second.x4n;
255             if (x4n != 0) {
256                 if (cubes[x4n].x4p != id) {
257                     ok = false;
258                     break;
259                 }
260                 bool f = true;
261                 Pos pos;
262                 for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
263                     if (f == false) break;
264                     if ((*its).id == id) {
265                         pos.id = x4n;
266                         pos.x1 = (*its).x1;
267                         pos.x2 = (*its).x2;
268                         pos.x3 = (*its).x3;
269                         pos.x4 = (*its).x4 - 1;
270                         for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
271                             if ((*itr).id == x4n) {
272                                 f = false;
273                                 break;
274                             }
275                         }
276                     }
277                 }
278                 if (f == true) { 
279                     solid.push_back(pos);
280                 }
281             }
282         }
283         if (solid.size() != n) {
284             ok = false;
285         }
286         if (ok == false) {
287             cout << "Inconsistent" << endl;
288             continue;
289         }
290         int x1min = 1000;
291         int x1max = -1000;
292         int x2min = 1000;
293         int x2max = -1000;
294         int x3min = 1000;
295         int x3max = -1000;
296         int x4min = 1000;
297         int x4max = -1000;
298         for (vector<Pos>::iterator it = solid.begin(); it != solid.end(); ++it) {
299             if (x1min >(*it).x1) x1min  = (*it).x1;
300             if (x1max < (*it).x1) x1max = (*it).x1;
301             if (x2min >(*it).x2) x2min  = (*it).x2;
302             if (x2max < (*it).x2) x2max = (*it).x2;
303             if (x3min >(*it).x3) x3min  = (*it).x3;
304             if (x3max < (*it).x3) x3max = (*it).x3;
305             if (x4min >(*it).x4) x4min  = (*it).x4;
306             if (x4max < (*it).x4) x4max = (*it).x4;
307         }
308         int vol = (x1max - x1min + 1) * (x2max - x2min + 1) * (x3max - x3min + 1) * (x4max - x4min + 1);
309         cout << vol << endl;
310     }
311     system("pause");
312     return 0;
313 }
View Code

转载于:https://www.cnblogs.com/dengeven/p/3228269.html

相关文章:

中国电子学会青少年编程能力等级测试图形化三级编程题:海底寻宝

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

用Ajax请求服务器的图片,并显示在浏览器中(转)

前言 一直在数据库里面存的都是图片在服务器的地址&#xff0c;然后再到浏览器中显示&#xff0c;但是发现两个问题 第一&#xff1a;为了安全起见&#xff0c;js是无法读取本地的图片的&#xff0c;不然你写一个js&#xff0c;岂不是可以获取任何人电脑里面的文件了。 第二&am…

pb设置Oracle事务的隔离级别,Oracle的事务隔离级别

ANSI/ISO SQL规定了四种事务隔离级别&#xff0c;分别是&#xff1a;read uncommitted,read committed,repeatable read,serializableORACE提供了SQ92标准中的read committed和seriaizabe&#xff0c;同时提供了非SQ92标准的read-ony。read committed&#xff1a;这是ORACE缺省…

inux php pdo mysql 扩展

今天在本机部署了一个pdo项目&#xff0c;发现一些问题&#xff0c;真没想到pdo mysql&#xff0c;不容易装啊&#xff0c;哈哈&#xff0c;我说的不容易&#xff0c;是因为php5.3以前版本&#xff0c;yum源里面根本没有。部署后就报&#xff0c;Undefined class constant MYSQ…

Maven项目Spring Boot启动

1. pom.xml中增加配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version></parent><dependencies><dependency><gr…

中国电子学会青少年编程能力等级测试图形化四级模拟题

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

Oracle设置date数据比较,ORACLE DATE和TIMESTAMP数据类型的比较

DATE数据类型这个数据类型我们实在是太熟悉了&#xff0c;当我们需要表示日期和时间的话都会想到date类型。它可以存储月&#xff0c;年&#xff0c;日&#xff0c;世纪&#xff0c;时&#xff0c;分和秒。它典型地用来表示什 么时候事情已经发生或将要发生。DATE数据类型的问题…

POJ 1552 Doubles (C++ STL set使用)

题目&#xff1a; 题意&#xff1a;题意&#xff1a;给出几个正数&#xff08;2~15个&#xff09;&#xff0c;然后就是求有这些数字的2倍有没有和原先的正数相同的&#xff0c;求出有几个&#xff0c;没有就是0. 分析&#xff1a;水题。用数组解决&#xff0c;开一个数组存正数…

凌亮:动手学数据分析笔记

凌亮是华北电力大学数理系大二的学生&#xff0c;LSGO软件技术团队&#xff08;Dreamtech算法组&#xff09;成员&#xff0c;参加了多期Datawhale的组队学习。 这篇图文是他在线下组队学习时&#xff0c;为大家分享自己学习“动手学数据分析”的笔记。 希望参与我们线下组队…

【H.264/AVC视频编解码技术详解】十九:熵编码算法(5)——H.264的CABAC(上):语法元素的二值化方法...

《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线&#xff0c;视频中详述了H.264的背景、标准协议和实现&#xff0c;并通过一个实战工程的形式对H.264的标准进行解析和实现&#xff0c;欢迎观看&#xff01; “纸上得来终觉浅&#xff0c;绝知此事要躬行”&…

oracle anbob,Tag Archives: oracle安装 | ANBOB

2016/08/02363 viewsUsing ‘opatch lsinventory’ show patched is real? (看到的补丁信息真的靠谱么&#xff1f;)已关闭评论去年在排查SCN 天花板问题修改相关的几个参数时&#xff0c;发现了这个问题&#xff0c;尤其如果是从别人手中接手的数据库&#xff0c;通常从opatc…

Python之装饰器

Python之装饰器 在不修改函数调用方式的前提下&#xff0c;也不能修改函数内部源代码&#xff01;&#xff01;&#xff01;&#xff01; 例如&#xff1a; 在每个季度公司发绩效&#xff0c;统计每个人的代码执行效率。咱们总不能是每个函数里加time模块吧。 import timedef t…

Datawhale组队学习周报(第041周)

本周报总结了从 11月22日至11月28日&#xff0c;Datawhale组队学习的运行情况&#xff0c;我们一直秉承“与学习者一起成长的理念”&#xff0c;希望这个活动能够让更多的学习者受益。 第 31 期组队学习已经与大家见面了&#xff0c;这次组队学习一共 11 门开源课程&#xff0…

Redis介绍

redis是一个key-value存储系统。和Memcached类似&#xff0c;但是解决了断电后数据完全丢失的情况&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs&#xff08;哈希类型&#xff09;。这…

oracle精度制的数据类型,ORACLE 中NUMBER 类型 低精度转换成高精度

Node&period;js的函数返回值先看一段代码: function select(sqlscript){ var result ""; sql.connect(config, function( ...LeetCode Range Sum Query 2D - Mutable原题链接在这里:https://leetcode.com/problems/range-sum-query-2d-mutable/ 题目: G…

cacti监控linux和windows磁盘IO

cacti监控linux和windows磁盘IO 标签&#xff1a;cacti linux磁盘IO windows磁盘IO原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://charlie928.blog.51cto.com/3741218/1331780一&#x…

2021 线性代数 第三章 习题课

第3章 向量空间 3.1 基本概念&#xff08;基础部分&#xff09;3.1 基本概念&#xff08;提高部分&#xff09; -> 插入视频 3.2 线性相关、线性无关&#xff08;基础部分&#xff09;3.2 线性相关、线性无关&#xff08;提高部分&#xff09;3.3 向量空间的基与维数、坐…

MYSQL修改配置,允许远程访问

1、 mysql -h localhost -u root //这样应该可以进入MySQL服务器 2、 GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION //赋予任何主机访问数据的权限 如果需要密码&#xff1a; GRANT ALL PRIVILEGES ON *.* TO roo…

ckeditor finder php,CKEDITOR CKFINDER的图片上传配置(C#/asp.net/php)

CKEDITORCKFINDER的图片上传配置(C#/asp教程.net/php教程)phpkeditor的代码全部重写&#xff0c;但里面没有了上传功能&#xff0c;只是一个纯粹的文件在线编辑器&#xff0c;如果需要上传图片&#xff0c;还需要下载ckfinder。首先去官方上下载源代码&#xff0c;然后分别解压…

Linux 常用命令——df, du, ln

1. df 列出文件系统的整体磁盘使用量 2. du 评估文件系统的磁盘使用量(常用在推估目录所占容量)&#xff0c;也可以计算文件或文件夹大小 3. ln 创建实体连接(hard link) 或 符号连接(Symbolic Link) 转载于:https://www.cnblogs.com/bigben0123/p/3238199.html

nio selector

为什么使用Selector? 仅用单个线程来处理多个Channels的好处是&#xff0c;只需要更少的线程来处理通道。事实上&#xff0c;可以只用一个线程处理所有的通道。对于操作系统来说&#xff0c;线程之间上下文切换的开销很大&#xff0c;而且每个线程都要占用系统的一些资源&…

青少年编程竞赛交流群周报(第039周)

2021年11月28日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第三十九期直播活动。 一、直播内容 我们直播活动的主要内容如下&#xff1a; 讲解了上次测试中小朋友们做错的题目 Scratch青少年编程能力等级测试模拟题&#xff08;四级&#xff09;。…

linux查找以h结尾的文件,【linux_笔记】Linux_文件查找(find)详解特殊权限

学习记录过程中难免出现错误&#xff0c;如有发现&#xff0c;还望大神们指出。示例操作部分有的与历史操作有关&#xff0c;如果先前的示例操作没有执行过的话&#xff0c;可能会有部分示例的操作无法执行。示例仅供参考(练习题在附录)。文件查找&#xff1a;locate(不常用):非…

AngulerJS学习(五)按需动态载入文件

在此之前我么年首先要先了解几个东西&#xff1a; $q 简单介绍&#xff1a; $q&#xff1a;主要解决的是异步编程的问题&#xff0c;是指描写叙述通过一个承诺行为与对象代表的异步运行的行动结果的交互。可能会也可能不会再不论什么时候完毕。 我们通过一个小故事理解 $q 服务…

【青少年编程竞赛交流】11月份微信图文索引

11月份微信图文索引 由于“组队学习”这个公众号的功能主要是组织Datawhale社群中的学习者们每个月的组队学习&#xff0c;所以&#xff0c;我另外新建了这个微信公众号“青少年编程竞赛交流”&#xff0c;在这个公众号上分享有关青少年编程方面的知识&#xff0c;以及通过编程…

linux内核创建节点,Linux内核驱动自动创建设备节点文件

Linux下生成驱动设备节点文件的方法有3个&#xff1a;1、手动mknod&#xff1b;2、利用devfs&#xff1b;3、利用udev在刚开始写Linux设备驱动程序的时候&#xff0c;很多时候都是利用mknod命令手动创建设备节点&#xff0c;实际上Linux内核为我们提供了一组函数&#xff0c;可…

javascript publish/subscribe or observer pattern

定义 定义一对多的对象封装&#xff0c;目标对象状态发生变化&#xff0c;它所有的接受者都会收到通知并做相应的更新。 使用频率&#xff1a;5/5 最高 概要 观察者模式&#xff0c;也就是发布者/订阅者模式&#xff0c;当发布者发布一个通知的时候&#xff0c;订阅者就会收到通…

图的遍历——DFS(邻接矩阵)

递归 标记 一个连通图只要DFS一次&#xff0c;即可打印所有的点。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <malloc.h>using namespace std;const int VERTEX_NUM 20; const int INFINITY 0x…

徐韬:CCF - 个贷违约预测Baseline

徐韬是华北电力大学数理系大四的学生&#xff0c;Datawhale成员/Dreamtech成员&#xff0c;参加了多期Datawhale的组队学习&#xff0c;也在天池/CCF/讯飞等比赛中取得了不错的成绩&#xff0c;现保送大连理工大学软件学院深造。 这篇图文是他在线下组队学习时&#xff0c;为大…

linux 创建crontab文件位置,[基础教程]linux系统的crontab计划任务添加和删除

在linux系统中&#xff0c;有时候为了节省人力&#xff0c;所以将一些脚本进行定时执行&#xff0c;通过crontab计划任务进行启动和停止&#xff0c;这样能方便大部分时间来做其他事情&#xff0c;下面主要介绍一下如何启动和删除crontab计划任务添加计划任务1.首先要准备好要添…