拼图拼不出来怎么办?

321 阅读5分钟

0zm1r12000hm52s32B2A4.jpg

之前朋友推荐了一款拼图,可以拼出来某一天的日期、月份与星期数.

一般的拼图只有一个拼法,拼完了之后,也就结束了.

这个拼图就有点意思了,想着可以每天拼一个出来,打卡一下,就买了一个.

这个拼图看着是有点难,实际上是一点也不简单.

别说拼出来正确的日期了,就是完整的把9个模块拼进去,不论结果正确与否,也是老费劲了.

在尝试了一段时间后,拼不出就是拼不出,天赋上差点意思.

之后那是越想越气,吃嘛嘛不香,实在不行就只能走邪道了,我自己拼不出来,我写代码还不行吗?

以下就开始剧透了,想自己玩的,就稍后再看吧:

- 第一步,画出基础的拼图内容

我们先设计一下整个拼图,需要用一个二维数组来代表拼图中的每一个元素

[
  "000000",
  "000000",
  "000000",
  "000000",
  "000000",
  "000000",
  "000000",
  "000000",
  "000000"
]

这里就偷懒了一下,数组里面用的是字符串,每个拼图格子的内容用0和1表示,1为此格子有内容,0则反之. 上面这个就是个空的拼图容器.

- 第二步,画出每个模块

[
    "111110",
    "010000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ]

取一个模块出来,放到容器里,大概就是这么个内容.

这里就有两个重点:

1.每个模块有4个方向

2.每个模块有正反2个面

所以每个模块都有8种不同的形式.

这个说起来是有点抽象的,可以找一张纸,撕成上面这个模块的形状,自己比划一下就理解了.

- 第三步,根据不同模块,生成可放入容器的所有位置

这里就放了一部分代码,按行与列进行循环,生成具体的代码:

[
    "111110",
    "010000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ],
  [
    "011111",
    "001000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ],
  [
    "000000",
    "111110",
    "010000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ],
  [
    "000000",
    "011111",
    "001000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ]

不同模块8种形式经过生成处理后,会有上百种放入容器的形式.

- 第四步,拼图行为

这里需要单独的处理下两个行为:

1.模块放入容器时的融合行为

[
    "111110",
    "010000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ],
  [
    "000000",
    "100000",
    "111100",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ],
  [
    "111110",
    "110000",
    "111100",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ]

2.模块放不进容器时的判断行为

[
    "111110",
    "010000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ],
  [
    "100000",
    "111100",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000",
    "000000"
  ]

当想要往容器中放入模块时,发现有任意位置的数字有冲突,即为无法放入.

这个判断逻辑非常的重要,我们实际的拼图操作,就是依赖此逻辑.

- 第五步,反复尝试,直至拼图完成

当我们完成以上步骤之后,实际已经完成了80%的内容,后面只需要根据常规的拼图思路,完成剩余的部分.

梳理一下拼图的流程:

1.确定目标日期的拼图位置,如2025-01-06:

[
    "100000",
    "000000",
    "000001",
    "000000",
    "000000",
    "000000",
    "000000",
    "000100",
    "000000"
]

2.放入一个模块

[
    "000000",
    "000000",
    "000000",
    "010000",
    "011111",
    "000000",
    "000000",
    "000000",
    "000000"
 ]

放完之后的容器:

[
    "100000",
    "000000",
    "000001",
    "010000",
    "011111",
    "000000",
    "000000",
    "000100",
    "000000"
 ]

3.重复上述步骤,直至把所有模块全部放入容器

以上只是一个粗略的步骤,实际上在放入模块时,需要进行的操作:

根据容器中现有的内容,排除掉冲突的模块,选择其一,再放入容器中

当放入了几个模块时,已填满了容器,无法再放入其他模块,但还有剩余的模块,那么就需要对已经放入的容器的模块进行调整,选择其模块的不同位置再次进行尝试:

拼图流程图.png

至此,某一个日期的拼图就完成啦!

0zm1h12000hm9hveg9CC3.png

代码链接