【问题标题】:Problem 98 - Project Euler问题 98 - 欧拉计划
【发布时间】:2011-05-20 07:57:13
【问题描述】:

问题如下:

通过将 CARE 一词中的每个字母分别替换为 1、2、9 和 6,我们形成了一个平方数:1296 = 36^(2)。值得注意的是,通过使用相同的数字替换,字谜 RACE 也形成了一个平方数:9216 = 96^(2)。我们将 CARE(和 RACE)称为方形字谜词对,并进一步说明不允许前导零,不同的字母也不能与另一个字母具有相同的数字值。

使用words.txt(右击和'Save Link/Target As...'),一个包含近两千个常用英文单词的16K文本文件,找到所有方形字谜单词对(不考虑回文单词成为自身的字谜)。

这样一对中的任何成员组成的最大平方数是多少?

注意:形成的所有字谜必须包含在给定的文本文件中。

我不明白 CARE 到 1296 的映射?这是如何运作的?还是要尝试所有排列映射,即所有字母到 1-9?

【问题讨论】:

    标签: anagram


    【解决方案1】:

    允许将所有数字分配给字母。所以 C=1, A=2, R=3, E=4 将是一个可能的分配......除了 1234 不是正方形,所以这不好。

    也许另一个例子可以帮助说明清楚?如果我们指定 A=6、E=5、T=2,则 TEA = 256 = 16² 和 EAT = 625 = 25²。所以 (TEA=256, EAT=625) 是一个方形字谜词对。

    (仅仅因为允许将所有数字分配给字母,并不意味着实际尝试所有这些分配是解决问题的最佳方法。可能还有其他更聪明的方法。)

    【讨论】:

      【解决方案2】:

      简而言之:是的,所有排列都需要尝试。

      【讨论】:

        【解决方案3】:

        如果您测试数字的所有替换字母,那么您正在寻找具有属性的正方形对:

        • 长度相同
        • 与输入字符串中的出现次数相同。

        找到所有这些正方形对会更快。有 68 个长度为 4 的方格,216 个长度为 5 的方格,...通过上属性过滤所有相同长度的方格将生成“少量”对,这是您正在寻找的解决方案。

        这些数据是“静态的”,不依赖于输入字符串。它可以计算一次并用于所有输入字符串。

        【讨论】:

          【解决方案4】:

          嗯。这个怎么放。组建欧拉计划的人承诺,每一个问题都有一个不到一分钟的解决方案,我认为只有一个问题可能无法实现这一承诺,但事实并非如此。

          是的,您可以排列数字,并尝试对所有正方形进行所有排列,但这将是一个非常大的搜索空间,根本不可能是 (TM) 正确的事情。一般来说,当你看到你对问题的“观察”会产生一个花费太长时间的搜索时,你需要搜索其他东西。

          例如,假设您被要求确定将两个素数相乘的结果是 1 到数亿。您可以考虑从 1 到数亿之间的每个数字,但是将两个素数的所有组合相乘并相乘可能会更快。由于您正在查看组合,您可以从两个开始,直到结果太大,然后对三个做同样的事情,等等。相比之下,这应该快得多 - 而且您不必将所有数字相乘出来,你可以记录所有素数,然后将它们相加,然后找到每个素数的极限,给你一个可以加起来的数字列表。

          有很多创新的解决方案,但你想到的第一个——尤其是你在 Project Euler 描述问题时想到的那个,很可能是错误的。

          那么,你该如何解决这个问题呢?可能有太多排列要看,但也许您可以通过映射和比较映射找出一些东西?

          (尽量避免全部泄露。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-08
            • 1970-01-01
            • 2011-05-13
            • 1970-01-01
            相关资源
            最近更新 更多