#P1162. Building with Blocks

Building with Blocks

本题没有可用的提交语言。

描述

一个单位立方体(unit cube)是指边长为1的立方体,其顶点的xxyyzz坐标均为整数。如果两个单位立方体共享一个面,则称它们是连通的。一个三维实体(solid)是由若干连通单位立方体组成的非空集合(见图1)。实体的体积即其所含单位立方体的数量。

</p>

一个(block)是体积不超过4的实体。如果两个块能通过平移和旋转(不包括镜像)相互转换,则认为它们是同类型的。共有12种不同的块类型(见图2)。图中的颜色仅用于区分结构,无其他含义。

对于一个实体SS,若块集合DD满足以下条件,则称DDSS的一个分解

  1. DD中所有块的并集等于SS
  2. DD中任意两个不同的块不共享任何单位立方体。

你的任务是编写程序,给定一个实体SS的描述,找到能分解SS最少数量的块集合,并统计这些块中每种类型出现的次数。

输入

程序从标准输入读取数据:

  • 第1行:实体SS的体积VV1V501 \leq V \leq 50);
  • 接下来的VV行:每行包含三个整数xxyyzz,表示SS中每个单位立方体的最小角坐标(1x,y,z71 \leq x, y, z \leq 7)。

输出

程序向标准输出写入:

  • 第1行:分解SS所需的最少块数MM

示例

输入数据1

18
2 1 1
4 1 1 
2 3 1 
4 3 1
2 1 2
3 1 2
4 1 2 
1 2 2 
2 2 2
3 2 2
4 2 2
2 3 2
3 3 2 
4 3 2
4 2 3
4 2 4
4 2 5
5 2 5

输出数据1

5

来源
IOI 2000