题目来源: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的更多相关文章

  1. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  2. Daily Query

    -- GI Report SELECT A.PLPKLNBR, D.DNDNHNBR, F.DNSAPCPO, C.PPPRODTE, A.GNUPDDTE GI_DATE, B.INHLDCDE, ...

  3. 【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 ...

  4. ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...

  5. ABP源码分析十:Unit Of Work

    ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...

  6. 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 ...

  7. 4D卓越团队-两天培训总结

    上周末参加了公司组织的领导力培训课程-4D卓越团队(创业型团队领导力训练项目),感觉有一些用,在这里分享一下. 课前游戏 培训老师先带我们做了一个游戏:每一个人,在同时参加培训的人中找到另外的 6 个 ...

  8. VS2012 Unit Test 个人学习汇总(含目录)

    首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...

  9. VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式

    [1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...

随机推荐

  1. 转 Django根据现有数据库,自动生成models模型文件

    Django引入外部数据库还是比较方便的,步骤如下 : 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自 ...

  2. BZOJ2120:数颜色

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  3. 低调的css3属性font-size-adjust

    在我们日常的项目中经常会用到不同的字体来达到我们想要的效果,可是某些情况下不同字体的大小在相同的px下显示的大小是不同的 <div id="div1">Text 1&l ...

  4. web攻击之七:常见CDN回源问题总结

    1. URL链接出现非法链接 (如 */./Play/show/id/349281 ); 2. CDN接收未知Referer处理失效(目前搜索引擎的状态码为499); 3. CDN抓取服务器 Cach ...

  5. influxdb api

    https://influxdb-python.readthedocs.io/en/latest/examples.html

  6. JSP介绍(4)--- JSP 过滤器

    过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理这些响应. 过滤器通过 Web 部署描述符 ...

  7. stm32之UCOS-III

    一.UCOS-III 学习UCOS-III,一般会学习以下内容: 任务创建.删除.挂起.恢复等: 临界区:独占CPU,尽量少用,否则会降低效率: 时间管理:时钟节拍(基于硬件定时器).软件定时器: 互 ...

  8. window下git,TortoiseGit安装,以及和github托管项目

    下载地址:http://msysgit.github.io/,安装时最好是先装git,再安装TortoiseGit. 一.git安装 1.第一步 2.第二步 3.第三步 4.第四步 5.第五步 6.第 ...

  9. kvm 基础 虚拟机改名

    转自:http://www.cnblogs.com/5201351/p/4464350.htm 1.查看所有的kvm虚拟机 [root@5201351_kvm ~]# virsh list --all ...

  10. python 基础 列表 小例子

    存主机ip到列表 host_list=[] netip='192.168.1' for hostip in range(1,254): ip = netip +str(hostip) host_lis ...