【发布时间】:2013-06-21 02:49:43
【问题描述】:
我正在计划一个 C++ 程序,它需要 3 个字符串来表示一个密码谜题。例如,给定 TWO、TWO 和 FOUR,程序将找到每个字母的数字替换,使得数学表达式
TWO
+ TWO
------
FOUR
为真,假设输入是右对齐的。解决这个问题的一种方法当然是暴力破解,用嵌套循环为每个字母分配每个可能的替换,反复尝试求和等等,直到最终找到答案。
我的想法是,尽管这非常低效,但底层的循环检查可能是一种可行(甚至是必要)的方法——在执行一系列推论以限制每个变量的域之后。我发现它有点难以想象,但首先假设这样的一般/填充结构是否合理(每个 X 代表一个不必要的不同数字,每个 C 是一个进位数字,在这种情况下,将是 0 还是 1)? :
CCC.....CCC
XXX.....XXXX
+ XXX.....XXXX
----------------
CXXX.....XXXX
考虑到这一点,还有一些规划思路:
-尽管问题中不会给出前导零,但我可能应该在适当的地方添加足够的零,以使事情变得均匀/匹配操作数。
-我想我应该从每个字母的一组可能值 0-9 开始,可能作为向量存储在“域”表中,并在进行扣除时从中消除值。例如,如果我看到一些像这样排列的字母
A
C
--
A
,我可以说 C 为零,这会从其域中消除所有其他值。我可以想出不少推论,但是将它们推广到各种小情况并放入代码中,乍一看似乎有点棘手。
-假设我有一系列很好的推论贯穿事物并从域表中引导出许多值,我想我仍然只是循环所有内容并希望状态空间足够小以生成解决方案在合理的时间内。但感觉必须有更多的东西! - 也许一些聪明的方程式要建立或类似的东西。
非常感谢您的提示!
【问题讨论】:
-
您认为答案是独一无二的吗?例如,如果有人给您
AA+BB=CC,您会尝试找到所有解决方案还是仅找到一个解决方案? -
第一个有效的答案就足够了。
-
您对 C++ 有什么疑问?
-
与其说是关于 C++ 的问题,不如说是一个信息标签,以显示容器方面可用的内容。使用可用工具将问题概念化是最困难的部分之一。另外,标签可能会产生很多点击。 :-)
-
我认为规划编程是一个合法且相关的话题;我敢肯定,人们发布的许多错误实际上都是计划不周的结果。无论如何,到目前为止,有 7 个人似乎根本不介意这个问题。
标签: math artificial-intelligence cryptarithmetic-puzzle