轨道
/
Scala
Scala
/
练习
/
杀手数独助手
杀手数独助手

杀手数独助手

中等

说明

你的一个朋友正在学习如何解杀手数独(规则见下文),但总是搞不清一个笼子里能填哪些数字。他请你帮个忙,写一个小程序,列出给定笼子的所有有效组合,以及会影响该笼子的约束条件。

为了让程序的输出便于阅读,返回的组合必须排好序。

杀手数独规则

  • 遵循标准数独规则。
  • 笼子(通常用虚线标出)里的数字之和,等于笼子角上标出的小数字。
  • 同一个数字在一个笼子里只能出现一次。

想了解更详细的说明,可以查看这份指南。

示例 1:只有 1 种可能组合的笼子

在一个数字之和为 7 的 3 格笼子里,只有一种有效组合:124。

  • 1 + 2 + 4 = 7
  • 其他任何加起来等于 7 的组合,比如 232,都会违反笼子内不得重复数字的规则。

数独网格,其中标出了三个被归为一组的杀手笼。
第一个杀手笼位于网格左上角的 3×3 宫内。
该宫的中间一列构成这个笼子,从上到下的格子依次是:第一个格子包含一个 1 和一个 7 的铅笔标记,表示笼子的数字之和为 7;第二个格子包含一个 2;第三个格子包含一个 5。
这些数字被标红,表示有错误。
第二个杀手笼位于网格中央的 3×3 宫内。
该宫的中间一列构成这个笼子,从上到下的格子依次是:第一个格子包含一个 1 和一个 7 的铅笔标记,表示笼子的数字之和为 7;第二个格子包含一个 2;第三个格子包含一个 4。
这个笼子里的数字都没有标红,因此没有错误。
第三个杀手笼沿着网格中央 3×3 宫的外角分布。
它由以下三个格子组成:笼子左上角的格子包含一个 2,已标红,以及一个表示笼子数字之和为 7 的标记。
笼子右上角的格子包含一个 3。
笼子右下角的格子包含一个 2,已标红。其他所有格子都是空的。

示例 2:有多种组合的笼子

在一个数字之和为 10 的 2 格笼子里,有 4 种可能的组合:

  • 19
  • 28
  • 37
  • 46

数独网格,除中间一列(第 5 列)有 8 行已填外,其余格子均为空。
每相邻的两行构成一个杀手笼,并被标为同一组。
从上到下:第一组是一个值为 1、带有一个表示笼子数字之和为 10 的铅笔标记的格子,以及一个值为 9 的格子。
第二组是一个值为 2、带有一个 10 的铅笔标记的格子,以及一个值为 8 的格子。
第三组是一个值为 3、带有一个 10 的铅笔标记的格子,以及一个值为 7 的格子。
第四组是一个值为 4、带有一个 10 的铅笔标记的格子,以及一个值为 6 的格子。
这一列最后一个格子是空的。

示例 3:组合受限制的笼子

在一个数字之和为 10 的 2 格笼子里,如果所在列已经含有 1 和 4,那么有 2 种可能的组合:

  • 28
  • 37

根据标准数独规则,由于这一列中已有 1 和 4,所以 19 和 46 都不可能。

数独网格,除中间一列(第 5 列)有 8 行已填外,其余格子均为空。
第一行包含一个 4,第二行是空的,第三行包含一个 1。
这个 1 被标红,表示有错误。
这一列最后 6 行构成三个由两个格子组成的杀手笼。
从上到下:第一组是一个值为 2、带有一个表示笼子数字之和为 10 的铅笔标记的格子,以及一个值为 8 的格子。
第二组是一个值为 3、带有一个 10 的铅笔标记的格子,以及一个值为 7 的格子。
第三组是一个值为 1(已标红)、带有一个 10 的铅笔标记的格子,以及一个值为 9 的格子。

自己动手试试

如果你想尝试一道比较容易上手的杀手数独,可以试试 Clover 出的这道谜题,它由 Mark Goodliffe 在 2021 年 6 月 21 日的 Cracking The Cryptic 节目中推荐。

你还可以在许多报纸,以及数独应用、书籍和网站上找到难度各异的杀手数独。

致谢

上面的截图是用 F-Puzzles.com 生成的,这是 Eric Fox 开发的一款出题工具。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Scala Exercism

准备好开始 杀手数独助手 了吗?

注册 Exercism,借助 95 个练习 和真人导师指导,学习并掌握 Scala,全部免费。