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即可。
//////////////////////////////////////////////////////////////////////////
// POJ1022 Packing Unit 4D Cubes
// Memory: 300K Time: 16MS
// Language: C++ Result: Accepted
////////////////////////////////////////////////////////////////////////// #include <iostream>
#include <vector>
#include <map> using namespace std; class Cube {
public:
int x1p, x1n, x2p, x2n, x3p, x3n, x4p, x4n;
};
class Pos {
public:
int id;
int x1, x2, x3, x4;
}; int main() {
int ncase;
cin >> ncase;
for (int caseNo = ; caseNo <= ncase; ++caseNo) {
int n;
map<int, Cube> cubes;
cin >> n;
for (int i = ; i <= n; ++i) {
int id;
cin >> id;
Cube cube;
cin >> cube.x1p >> cube.x1n >> cube.x2p >> cube.x2n
>> cube.x3p >> cube.x3n >> cube.x4p >> cube.x4n;
cubes[id] = cube;
}
bool ok = true;
vector<Pos> solid;
Pos firstPos;
firstPos.id = (*cubes.begin()).first;
firstPos.x1 = firstPos.x2 = firstPos.x3 = firstPos.x4 = ;
solid.push_back(firstPos);
for (map<int, Cube>::iterator itc = cubes.begin(); itc != cubes.end(); ++itc) {
Cube cube1;
int id = (*itc).first;
int x1p = (*itc).second.x1p;
//x1p
if (x1p != ) {
if (cubes[x1p].x1n != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x1p;
pos.x1 = (*its).x1 + ;
pos.x2 = (*its).x2;
pos.x3 = (*its).x3;
pos.x4 = (*its).x4;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x1p) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
} //x1n
int x1n = (*itc).second.x1n;
if (x1n != ) {
if (cubes[x1n].x1p != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x1n;
pos.x1 = (*its).x1 - ;
pos.x2 = (*its).x2;
pos.x3 = (*its).x3;
pos.x4 = (*its).x4;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x1n) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
} //x2p
int x2p = (*itc).second.x2p;
if (x2p != ) {
if (cubes[x2p].x2n != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x2p;
pos.x1 = (*its).x1;
pos.x2 = (*its).x2 + ;
pos.x3 = (*its).x3;
pos.x4 = (*its).x4;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x2p) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
}
//x2n
int x2n = (*itc).second.x2n;
if (x2n != ) {
if (cubes[x2n].x2p != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x2n;
pos.x1 = (*its).x1;
pos.x2 = (*its).x2 - ;
pos.x3 = (*its).x3;
pos.x4 = (*its).x4;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x2n) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
} //x3p
int x3p = (*itc).second.x3p;
if (x3p != ) {
if (cubes[x3p].x3n != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x3p;
pos.x1 = (*its).x1;
pos.x2 = (*its).x2;
pos.x3 = (*its).x3 + ;
pos.x4 = (*its).x4;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x3p) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
}
//x3n
int x3n = (*itc).second.x3n;;
if (x3n != ) {
if (cubes[x3n].x3p != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x3n;
pos.x1 = (*its).x1;
pos.x2 = (*its).x2;
pos.x3 = (*its).x3 - ;
pos.x4 = (*its).x4;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x3n) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
}
//x4p
int x4p = (*itc).second.x4p;
if (x4p != ) {
if (cubes[x4p].x4n != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x4p;
pos.x1 = (*its).x1;
pos.x2 = (*its).x2;
pos.x3 = (*its).x3;
pos.x4 = (*its).x4 + ;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x4p) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
}
//x4n
int x4n = (*itc).second.x4n;
if (x4n != ) {
if (cubes[x4n].x4p != id) {
ok = false;
break;
}
bool f = true;
Pos pos;
for (vector<Pos>::iterator its = solid.begin(); its != solid.end(); ++its) {
if (f == false) break;
if ((*its).id == id) {
pos.id = x4n;
pos.x1 = (*its).x1;
pos.x2 = (*its).x2;
pos.x3 = (*its).x3;
pos.x4 = (*its).x4 - ;
for (vector<Pos>::iterator itr = solid.begin(); itr != solid.end(); ++itr) {
if ((*itr).id == x4n) {
f = false;
break;
}
}
}
}
if (f == true) {
solid.push_back(pos);
}
}
}
if (solid.size() != n) {
ok = false;
}
if (ok == false) {
cout << "Inconsistent" << endl;
continue;
}
int x1min = ;
int x1max = -;
int x2min = ;
int x2max = -;
int x3min = ;
int x3max = -;
int x4min = ;
int x4max = -;
for (vector<Pos>::iterator it = solid.begin(); it != solid.end(); ++it) {
if (x1min >(*it).x1) x1min = (*it).x1;
if (x1max < (*it).x1) x1max = (*it).x1;
if (x2min >(*it).x2) x2min = (*it).x2;
if (x2max < (*it).x2) x2max = (*it).x2;
if (x3min >(*it).x3) x3min = (*it).x3;
if (x3max < (*it).x3) x3max = (*it).x3;
if (x4min >(*it).x4) x4min = (*it).x4;
if (x4max < (*it).x4) x4max = (*it).x4;
}
int vol = (x1max - x1min + ) * (x2max - x2min + ) * (x3max - x3min + ) * (x4max - x4min + );
cout << vol << endl;
}
system("pause");
return ;
}
POJ1022 Packing Unit 4D Cubes的更多相关文章
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- Daily Query
-- GI Report SELECT A.PLPKLNBR, D.DNDNHNBR, F.DNSAPCPO, C.PPPRODTE, A.GNUPDDTE GI_DATE, B.INHLDCDE, ...
- 【Moqui业务逻辑翻译系列】Shipment Receiver Receives Shipment with Packing Slip but no PO
Shipment Receiver receives shipment. It has invoice tucked into it. Receiver records vendor name, ve ...
- ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...
- ABP源码分析十:Unit Of Work
ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...
- Failed to stop iptables.service: Unit iptables.service not loaded.
redhat 7 [root@lk0 ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Fai ...
- 4D卓越团队-两天培训总结
上周末参加了公司组织的领导力培训课程-4D卓越团队(创业型团队领导力训练项目),感觉有一些用,在这里分享一下. 课前游戏 培训老师先带我们做了一个游戏:每一个人,在同时参加培训的人中找到另外的 6 个 ...
- VS2012 Unit Test 个人学习汇总(含目录)
首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...
- VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
[1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...
随机推荐
- 【二叉树的递归】06填充每个节点中的下一个正确的指针【Populating Next Right Pointers in Each Node】
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树 struct Tr ...
- xcopy语法
xcopy语法 2007-02-09 13:29:45| 分类: 服务器 | 标签:xcopy语法 |字号 订阅复制文件和目录,包括子目录. 语法 xcopySource [Destination] ...
- poj 2000 Gold Coins(水题)
一.Description The king pays his loyal knight in gold coins. On the first day of his service, the kni ...
- SQL连接、嵌套和集合查询---
SQL连接.嵌套和集合查询 一:连接查询 1 .不同表之间的连接查询 例 查询每个学生及其选修课程的情况. 本查询实际上是涉及Students与Reports两个表的连接操作.这两个表之间的联系是通过 ...
- Python函数(十一)-生成器
首先看一下什么是列表生成式 >>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> ...
- 基于STM32的三轴数字罗盘HMC5883L模块的测试
最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内.连续测量模式下,最快测量.输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲 ...
- kvm 基础 虚拟机改名
转自:http://www.cnblogs.com/5201351/p/4464350.htm 1.查看所有的kvm虚拟机 [root@5201351_kvm ~]# virsh list --all ...
- C语言连接mysql -insert-update
C语言连接mysql数据库实现insert语句:数据库:test表:systeminfo CREATE TABLE `systeminfo` ( `id` int(11) NOT NULL AUTO ...
- 7.XXEinjector:一款功能强大的自动化XXE注射工具
今天给大家介绍的是一款名叫XXEinjector的漏洞利用工具,XXEinjector是一款基于Ruby的XXE注入工具, 它可以使用多种直接或间接带外方法来检索文件.其中,目录枚举功能只对Java应 ...
- 21. CTF综合靶机渗透(十四)
靶机说明: I created this machine to help others learn some basic CTF hacking strategies and some tools. ...