在Java中使用置换解决方程式

问题描述

对于给定的问题,我被授予两个数字,这些数字将以这种方式求和成一定的结果:

num1 + num2 = result

但是这些数字将被“编码”,例如,输入可能是:

ab + bc = acd

数字最多可以是9位数字。

我的任务是创建一种有效的方法,以查找每个输入有多少可能的解决方案,或者是否不可能。

我通过创建一个名为Number(在Java中)的类解决了此问题,该类具有字母(字符类型)和数值(int),然后将每个数字转换为该新类Number的数组,因此我可以轻松检查它们的当前值。

但是我不确定如何解决此回溯问题。

我知道我应该开始比较数字1和数字2的单位,然后比较十位数,等等,在每个“级别”中,仅选择总和为逻辑的情况,例如,在上面的示例中对于单位b = 2和c = 3,只有在d = 5时才有意义,而我可以丢弃所有其他情况,对于这两个既有值,d!= 5。

我被告知可以仅使用两个周期来覆盖所有这些排列:一个用于遍历可能的数字[0至9],另一个用于覆盖所有字母/变量,但是我不太了解可以做到!

如果我不得不想象它,我想我可以把它想象为

for cycle ( through "columns" from the rightmost up to the leftmost column of the shortest number)
  for cycle( for numbers 0 to 9?) 

但是我仍然不能为解决这个问题而束手无策,或者我如何通过递归来解决这个问题,我非常感谢所有有助于增进理解的帮助。

解决方法

这是一种应该起作用的算法。

让我们以您的示例方程式为例:

ab + bc = acd
  1. 确定方程式中的唯一字符数。在您的示例中,该值为四个(a,b,c,d)。

  2. 为了迭代所有可能性,我们将建立一个循环。此循环的最小值为10 ^ 3或1,000。此循环的最大值为10 ^ 4或10,000。方程式中唯一字符的数量决定了您将使用的10的幂。最大最大值为10 ^ 10,大于intlong可以工作。

  3. 在迭代中,将索引分成N个数字。在您的示例中,这将是4位数字。由于我们要从1,000迭代到9,999(包括10,000)(不包括10,000),因此所有索引值都将有4位数字。

  4. 检查以确保N位数字是唯一的。无重复。这将消除开头的大多数索引值。

  5. 将数字代入方程式中,然后检查方程式是否有效。如果是这样,请将方程式保存到List<String>中。

  6. 在完成迭代后输出List值或找不到解决方案。