python - 具有未知魔法常数的 3x3 魔方(总和)
问题描述
我正在尝试填充 3x3 矩阵(正方形)中的缺失字段,以形成一个幻方(行、列两个对角线总和相同,填充任何不重复的正整数)。这种正方形的一个例子是:
[_ _ _]
[_ _ 18]
[_ 28 _]
因为它不遵循普通幻方的基本规则,其整数限制为 1-9(从 1 到 n^2)。, 魔法常数 (sum) 不等于 15 (n(n^2+1)/2) 而是未知的并且有许多可能的值。
我尝试了一种非常天真的方法,在空字段中生成随机数,任意最大值为 99,然后我将整个正方形传递给一个函数,检查它是否是一个有效的幻方。
它基本上会一直运行下去,直到在正确的位置找到数字组合。
不用说,这个解决方案很愚蠢,它会持续几个小时才能找到答案。
我还考虑过进行详尽的数字生成(基本上尝试每种数字组合),直到找到正确的数字,但这面临着同样的问题。
所以我需要帮助找出一种算法或某种方法来限制生成的随机数的范围
解决方案
3 x 3 幻方是具有以下三个基本元素的向量空间:
1 1 1 0 1 -1 -1 1 0
1 1 1 -1 0 1 1 0 -1
1 1 1 1 -1 0 0 -1 1
您可以引入 3 个变量 a、b、c 来表示 3 个基本元素中的每一个的贡献,并根据您的部分解为它们编写方程。
例如,给定您的示例网格,您将拥有:
a + b - c = 18
a - b - c = 28
立即给出 2b = 10 或 b=-5。并且 ac = 23,或 c=a-23。
解决方案的空间如下所示:
23 2a-28 a+5
2a-18 a 18
a-5 28 2a-23
您可以看到每行/列/对角线加起来为 3a。
现在您只需要找到满足您的正约束和非重复约束的 a 和 c 的整数解。
例如,a=100, b=-5, c=77 给出:
23 172 105
182 100 18
95 28 177
具有正整数元素的最小和幻方出现在 a=15 时,总和为 3a=45。
23 2 20
12 15 18
10 28 7
碰巧这里没有重复。如果有,我们只需尝试下一个更大的值,a
依此类推。
推荐阅读
- postgresql-9.5 - postgreSQL 支持的最大 tps
- google-chrome - 通过chrome中的链接突出显示文本
- sql - sql state 42830 : FK 引用表中具有复合主键的单个 PK
- python - 我最近卸载并重新安装了 python 并设置了它,但是有一个问题
- sql - 多行转置为具有多列的一行
- reactjs - 从api获取对象数组并存储到usestate但得到空数组
- html - WebView 未在 android 模拟器上显示
- visual-studio - 图片框未显示在面板内 - Visual Studio 2019
- gitlab - 无论如何在 Gitlab-ci 中动态定义工件路径?
- database - 如何在windows中打开大文件?