• 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
  • 相关阅读:
    初探nodejs事件循环机制event loop
    夯实基础之--new关键字、instanceOf原理
    分享-结合demo讲解JS引擎工作原理
    Linux-centos安装node、nginx小记
    openlayers5实战--踩坑总结
    node+koa中转层开发实践总结
    vue预渲染实践总结
    css多行省略-webkit-box-orient打包编译后失效原因
    使用mpVue开发小程序实战总结
    Linux crontab定时执行任务
  • 原文地址:https://www.cnblogs.com/dengeven/p/3228269.html
Copyright © 2020-2023  润新知