顶侧拼图是您需要构造3D形状的(通常为立方)块的拼图,并给出三个正交视图:顶视图,正视图和侧视图。
例如,给定顶视图,正视图和侧视图,如下所示:
Top: Front: Side:
. . . . . . . . . . . .
. x x . . x x . . x x .
. x x . . x x . . x x .
. . . . . . . . . . . .
In this problem, the side view is taken from the right.
一个2x2x2立方体(体积为8)可以满足此解决方案,但如果我们具有以下层结构,则它可以在体积4中使用:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
还有一些无法解决的安排。举个例子:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
如果顶视图显示该块位于左侧第二个位置,则无法匹配表示该块必须位于左侧第三个位置的前视图。因此,这种安排是不可能的。
您的任务是构建一个程序,给定一个任意的4x4顶部拼图,尝试以最少数量的多维数据集解决该问题,或者声明它不可解决。
您的程序将以一系列48位作为输入,分别表示俯视图,正视图和侧视图。它们可以是您想要的任何格式(6字节字符串,0和1的字符串,12位十六进制数字等),但是位的顺序必须这样映射:
Top: 0x00 Front: 0x10 Side: 0x20
0 1 2 3 0 1 2 3 0 1 2 3
4 5 6 7 4 5 6 7 4 5 6 7
8 9 a b 8 9 a b 8 9 a b
c d e f c d e f c d e f
换句话说,这些钻头按从左到右,从上到下的顺序排列,从上到下,从正面到侧面。
然后,您的程序将输出一系列64位,指示4x4x4网格中已填充的多维数据集,或者指示该网格不可解。
您的程序将通过运行1,000,000个测试用例来获得评分。
通过将整数“ 000000”到“ 999999”的MD5哈希作为字符串,提取每个哈希的前48位(12个十六进制),并将其用作top-front-front-侧面拼图。例如,以下是一些测试输入及其产生的困惑:
Puzzle seed: 000000 hash: 670b14728ad9
Top: Front: Side:
. x x . . . . x x . . .
x x x x . x . x x . x .
. . . . . x x x x x . x
x . x x . . x . x . . x
Puzzle seed: 000001 hash: 04fc711301f3
Top: Front: Side:
. . . . . x x x . . . .
. x . . . . . x . . . x
x x x x . . . x x x x x
x x . . . . x x . . x x
Puzzle seed: 000157 hash: fe88e8f9b499
Top: Front: Side:
x x x x x x x . x . x x
x x x . x . . . . x . .
x . . . x x x x x . . x
x . . . x . . x x . . x
前两个是无法解决的,而最后一个是具有以下几层的解决方案,从前到后:
x . . . . . . . x x x . x x x .
. . . . x . . . . . . . . . . .
x . . . . . . . . . . . x x x x
x . . . . . . . . . . . x . . x
There are a total of 16 blocks here, but it can probably be done in less.
程序的分数将由以下标准(优先级从高到低)确定:
- 解决的案件数最高。
- 解决这些情况所需的最少块数。
- 最短的代码(以字节为单位)。
您必须自己提交和计算分数,这要求您的程序能够运行所有1,000,000个测试用例。