Kakuro组合
因为我无法进行心理算术,所以我经常会遇到“ Kakuro难题”,这需要受害者反复计算出1到9(含)范围内的不同数字加起来到1到45范围内的另一个数字。有很多数字。例如,如果您可能想知道如何从3个数字中获取23,则唯一的答案是6 + 8 +9。(如果您熟悉此方法,则与Killer Sudoku相同)。
有时您还会有其他信息,例如无法显示数字1 ,因此仅用2个数字就获得8,则只能使用2 + 6和3 + 5(不能使用4 + 4,因为它们是不明显)。另外,也可能是您已经在解决方案中找到3,所以像3中19这样的数字必须是3 + 7 + 9。
您的任务是编写一个程序,该程序以严格的顺序和严格的布局列出给定问题的所有可能解决方案。
输入值
您的解决方案可以通过stdin,命令行参数,函数的参数,堆栈上的值或您喜欢的深奥语言所采用的任何疯狂方式,将输入作为单个ASCII字符串接收。字符串形式为
number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers
前两个参数是典型的以10为底的非负非零整数,分别在1到45和1到9的范围内(使用小数点将是无效的输入),这两个列表只是数字串在一起而在没有重复的特定顺序,如果为空列表则为'0'。列表之间不能有共享数字(0除外)。分隔符是单个空格。
输出量
您的输出必须以包含可能的解决方案数量的一行开头。您的程序必须打印出以换行符分隔的解决方案,这些解决方案按每个递增的有效数字进行排序,其中每个数字都位于您列出从1到9的数字的位置。下面的示例有望使这一点更加清楚。
如果提供了无效的输入,我不在乎您的程序会做什么,尽管我希望它不会将引导扇区清零。
例子
对于此示例输入
19 3 0 0
预期的输出将是
5
2 89
3 7 9
4 6 9
4 78
56 8
注意每个“缺失”数字的空格,这些是必需的;我不担心空格后面没有数字的空格(例如上面缺少的9)。您可以假定要打印的内容将使用等宽字体。还要注意排序,即首先列出具有较小最小数字的解决方案,然后列出具有最小第二个最小数字的解决方案,依此类推。
另一个例子,基于上面的例子
19 3 57 9
预期的输出将是
2
2 89
4 6 9
请注意,每个结果都包含9,没有结果包含5或7。
例如,如果没有解决方案
20 2 0 0
然后,您应该只输出一行0。
0
我故意将输入部分的解析作为此问题的乐趣。这是代码问题,可能是最短的解决方案。