益智游戏最后都交给程序去玩了系列。。。重要的事情说三遍:这不是方块游戏!这不是方块游戏!这不是方块游戏!不要被自己的眼睛欺骗了X3这是一个卡片叠叠叠的游戏以一个普通的“正方体”为例它就是个被划分出3个不同颜色区域的六边形卡片我们要做的,本质上是把这些六边形卡片叠在一起最后使暴露出的部分与范例相同(就是几张扑克牌拿在手里呈扇子形状的那个“叠”)到这里没问题的话,我们就已经摸到了这个问题的钥匙孔,那么钥匙在哪里呢?钥匙在笛卡尔手里XD这个游戏的“叠卡片”规则,使得无论叠出什么样的图形,构成它的所有单元六边形的中心点,都一定在同一个密布三角形网格上(不知道密布三角形网格的看过来:比如我们用7个围棋棋子尽可能密集地挤在一个平面上,最后呈现出的就是1个棋子在中间6个棋子围绕成六边形的形状,现在我们有好多好多棋子尽可能密集地挤在一个平面上,最后呈现的棋子的中心点就在密布三角形网格上)而这个三角形网格上任意一点,可以唯一地被一个二维坐标表示(看作压扁成60°的直角坐标系)现在,将范例所表现的目标图案分解成一个一个地单元六边形,然后这个图案就可以被一组坐标表示,把这组坐标记作A(分解方法叙述麻烦,程序也不容易做,就人工吧反正总共六边形也不多)同样地,我们手上的各个“积木”也可以各自被一组坐标表示,分别记作B1,B2,...,Bn然后_(:з」∠)_反正数据量不大就用遍历吧:在A中选择一个坐标p(px,py)(咳,point的y坐标,不要想太多X3)那么p至少可以被一个【Bi中的一个坐标(bx,by)与某个向量c(cx,cy)的和】表示遍历的粗糙叙述:输入A,Bi(i=1~n)(注意x、y坐标不小于0)规定空间大小maxx,maxy(取A的最大x、y)1指定A中最面一行的最左边的p(px,py)将所有【剩余】Bi的所有坐标试一遍,如果【某个Bi的某个坐标(bx,by)】被向量c平移到p点后,存在【Bi的某个其他坐标】不在A内,就排除【(bx,by)指向(px,py)】的情况并记录在error中,否则将Bi的i与对应的p记录在一起(雾:成为ip)并存在数组ans中,然后执行2如果所有的剩余Bi的所有坐标都不满足上述条件,则将该点标记为empty,执行22指定p(px=px+1,py)case:如果px>maxx,则px=0,py=py-1,执行2如果py<0,则结束循环,输出结果如果p在A内,则执行1如果p在A外且px<maxx,则执行2等等,要死如果所有Bi都用光了但是A还有点没填,会会会出错怎么办怎么办不会做_(xз」∠)_
11

