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
POJ1022 Packing Unit 4D Cubes相关推荐
- ACM题集以及各种总结大全(转)
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- 搜索题,留着以后慢慢刷
转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...
- POJ前面的题目算法思路【转】
1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...
- POJ 超详细分类
POJ 各题算法 1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 ...
- 精敏数字4D影片动感采集系统
JMDM-4DMMAU 精敏数字的一款4D/5D影院座椅和特效动作采集装置,也叫4D影片动感生成器.4D片源4D座椅和特效动作采集器.4D影院动感特效生成系统.4D电影动感自动生成装置.动作采集系统. ...
- V4d:4d Convolutional Neural Networks For Video-level Representation Learning
本文是一篇ICLR2020的文章 文章地址: http://xxx.itp.ac.cn/abs/2002.07442 Open Review: https://openreview.net/forum ...
- 写算子单元测试Writing Unit Tests
写算子单元测试Writing Unit Tests! 一些单元测试示例,可在tests/python/relay/test_op_level3.py中找到,用于累积总和与乘积算子. 梯度算子 梯度算子 ...
- DPU(Data Processing Unit)数据处理器
DPU(Data Processing Unit)数据处理器 DPU:5G边缘云 5G时代带来通信带宽的巨大提升,更多的带宽使能更多的应用.数据量的迅猛增多,服务器网络带宽的快速增长,都已经远超计算能 ...
- 4D毫米波雷达Radar
4D毫米波雷达Radar 概述 全球前四大的毫米波雷达供应商被称为"ABCD",即 Autoliv(美安).Bosch(博世).Continental(大陆)和 Delphi(德尔 ...
最新文章
- c#中Class和Struct使用与性能的区别
- PHPExel导出报表--导出类
- ABP vNext微服务架构详细教程——简介
- js时间搓化为今天明天_js转时间戳,时间戳转js
- System.Drawing.Color.FromArgb(144,238,255);
- Spring+Hessian搭建远程方法调用
- 6G尚处于早期研究阶段,长足发展需要时间和耐心
- 微信超赞新功能上线,终于知道钱花哪儿了
- xshell删除文件夹命令_ssh远程连接GPU服务器进行深度学习以及常用ssh命令汇总
- Teradata 金融数据模型FS-LDM
- linux UVC and hardware viewer
- mysql test run_MySQL自动测试框架
- Tsinsen-A1103 ====单循环赛制====固定轮转法。。
- html5网页设计作业代码 大学生校园网站制作 学校官网制作html
- JavaScript 模板引擎
- excel制作甘特图
- 如何使用计算机远程关闭手机软件,手机怎么控制电脑 手机远程控制电脑关机方法 (全文)...
- 聚是一团火散作满天星,前端Vue.js+elementUI结合后端FastAPI实现大文件分片上传
- 1003.Crashing Balloon
- java 3gp 转mp3_Java利用Jave转换视频格式为3gp
热门文章
- video怎么重新加载 vue_vue.js中vue-video-player中的怎么插入多个视频,视频可以同时播放的问题及解决办法...
- mysql 所有表的字段信息_mysql如何查询所有表和字段信息
- java向量vector类,java数据结构——Vector(向量类)
- linux mint 屏保_Linux Mint 修复了两个孩子发现的屏保锁定绕过漏洞
- proxmox 宕机转义_Proxmox+Ceph的HCI环境搭建
- java 输入流可以合并吗_HOW2J Java 文件输入输出流,合并与拆分
- 网上商城代码实现_中国中铁网上商城转型敏捷开发模式,实现快速反应、快速迭代...
- greenplum 数据库如何增加列_Greenplum行存与列存的选择以及转换方法-阿里云开发者社区...
- 快速排序(快排)--->注释超详细
- mysql种编译码写在哪_深入理解Java虚拟机(程序编译与代码优化)