【问题标题】:Magic square brute force algorithm魔方蛮力算法
【发布时间】:2014-01-19 17:15:44
【问题描述】:

基本上,对于分配,我需要创建一个 C# 程序,它将一个数字作为输入 (n),然后创建一个大小为 n*n 的二维数组,其中数字为 1 到 (n*n)。它需要使用蛮力方法。我已经这样做了,但目前程序每次都会随机生成数字的顺序,所以它有时会多次检查相同的顺序。显然这意味着检查任何大于 3 的数字都需要很长时间,即使是 3 也可能需要几分钟。基本上我想知道是否有任何方法可以让它只检查每个订单一次。我只被允许使用“基本”C# 函数,所以只有 *、/、+、- 之类的东西,而没有 .Shuffle 之类的东西。

【问题讨论】:

  • 你能自己写shuffle函数吗?这真的很容易做到。
  • 1) 向我们展示了您到目前为止所拥有的东西,以及 2) 您所说的蛮力是什么意思,为什么必须使用它? 3)如果你真的是指真正的蛮力(穷举搜索所有可能的组合),它显然对这个问题有严重的指数增长,即使是三个也应该很慢。
  • 根据您所做的,我假设这些数字必须随机分布在网格中(不仅仅是从左上角的 1 开始)。这是正确的吗?
  • 你用“订单”这个词是什么意思?
  • @Dukeling 是的,我有一个函数来创建数组,一个是洗牌,一个是把数字放入二维数组,一个是检查行、列和主对角线相等。目前我的主程序只是连续运行所有函数,然后如果校验和函数返回 false,那么它会再次运行它们。

标签: c# algorithm magic-square


【解决方案1】:

让我确保我理解了这个问题:您希望枚举数字 1 到 n 平方的所有排列,并检查排列是否产生幻方。您现在正在随机生成排列,但您希望生成所有排列。

我写了一系列关于生成排列的文章;篇幅太长,这里不方便总结。

http://ericlippert.com/2013/04/15/producing-permutations-part-one/

【讨论】:

    【解决方案2】:

    如您所见,选择随机顺序并不是一个好主意。

    我建议你把所有的数字 1 ... (n*n) 放在 array 中,然后找到所有的排列。

    当您拥有所有排列时,很容易创建正方形(1 .. n ==> 第一行,n+1 ... 2n ==> 第二行,依此类推)。

    现在,找到所有的排列可以用递归的基本操作来完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-22
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多