魔术广场错误的位置

magic square wrong placement of some numbers

本文关键字:位置 错误 魔术      更新时间:2023-10-16

我试图创建一个简单的3x3魔法正方形。3x3魔术正方形由连续的整数组成(从1开始,以9结束(将其放入" N"行By'n'列中,以使所有行,所有列和两个对角线总和到同一总数。

我的算法是1个,剩下1个。

我的问题是,我很难弄清楚为什么我不能保留我的上一个数字,而如果下一个列被一个数字占据,那么我就会下跌1。预先感谢您

#include <iostream>
using namespace std;
int main ()
{
int magicsq[3][3];
int i,j,x;
int row=0;      //start positon of row
int col=3/2;    // and colum
    for( i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            magicsq[i][j] = 0;      //initialize to 0 your matrix
        }   
    }
 magicsq[row][col] = 1;     //position to star the counting
 for(x=2;x<3*3;x++)
 {
    row--;
    col--;
    if(row<0){
        row=row+3;
     }
    if(col<0){
        col=col+3;
    }
    if(magicsq[row][col]!=0)
    {
        row++;                  //i think this is where im having trouble
    }
    magicsq[row][col] = x;
 }
 for( i = 0; i<3;i++){
    for(j = 0; j<3;j++)
    {
        cout<<magicsq[i][j] <<" ";
     }
     cout<<endl;
 }
}

通过整数问题进行划分;就这样。3/2是1。

if(magicsq[row][col!=0])也有效(所选的列为0或1(,但我认为您的意思是if(!magicsq[row][col])

我以前从未听说过魔法正方形,并就它们咨询了 Wikipedia 。正如预期的那样,我发现了各种算法的构造描述。

我将DelaLoubère的算法确定为OP显然试图实施的算法。恕我直言,尝试实际上还不错。

我给出的提示(缺少ROW包裹在(if(magicsq[row][col]!=0) row++;和(缺少迭代步骤中(for (x=2;x<3*3;x++)似乎是合理的。

考虑到这一点,我已经运行了算法。我的第一个结果看起来还不错,但是结果检查表明这实际上是错误的。我切换了行计数的一些指示,但没有运气。然后,我再次重新介绍了上面的链接文章,并将所描述的内容与我实施的内容进行了比较。最后,我发现我在实施中犯了另一个语义上的错误。我相信OP也做到了:

该方法从第一行的中央列开始,从数字1处开出。之后,填充正方形的基本运动是对角向上和向右的,一次是一步。如果遇到一个填充的正方形,则垂直向下移动一个正方形,然后像以前一样继续。当"向上和向右"移动将离开正方形时,它分别将其包裹在最后一行或第一列。

强调而不是由我完成;我错过的细节。因此,需要更改:如果单元格已经填充,则必须丢弃新单元的坐标。新的坐标为一行向下(即 ++row(。环绕。修复此样品后,样本计算出正确的结果:

#include <iostream>
int main()
{
  int magicsq[3][3] = {0}; // initializes magic square with all 0s
  // Algorithm of de la Loubere:
  int row = 0, col = 1; // start coordinates
  // assign start cell
  magicsq[row][col] = 1;
  for (int x = 2; x <= 9; ++x) {
    // compute up-right coordinates
    int rowT = row - 1; if (rowT < 0) rowT += 3;
    int colT = col + 1; if (colT >= 3) colT -= 3;
    // check whether cell not yet assigned
    if (magicsq[rowT][colT]) {
      // compute down coordinates
      if (++row >= 3) row -= 3;
    } else {
      // use up-right coordinates
      row = rowT; col = colT;
    }
    // assign next cell
    magicsq[row][col] = x;
  }
  // output of result:
  std::cout << "Magic Square:" << std::endl;
  for (row = 0; row < 3; ++row) {
    for (col = 0; col < 3; ++col) {
      std::cout << ' ' << magicsq[row][col];
    }
    std::cout << std::endl;
  }
  // check result:
  std::cout << "Row sums:";
  for (row = 0; row < 3; ++row) {
    int sum = 0;
    for (col = 0; col < 3; ++col) sum += magicsq[row][col];
    std::cout << ' ' << sum;
  }
  std::cout << std::endl;
  std::cout << "Column sums:";
  for (col = 0; col < 3; ++col) {
    int sum = 0;
    for (row = 0; row < 3; ++row) sum += magicsq[row][col];
    std::cout << ' ' << sum;
  }
  std::cout << std::endl;
  std::cout << "Diagonal sums: ";
  int sumM = 0, sumC = 0;
  for (row = 0; row < 3; ++row) {
    sumM += magicsq[row][row];
    sumC += magicsq[row][2 - row];
  }
  std::cout << ' ' << sumM << ' ' << sumC << std::endl;
  // done
  return 0;
}

输出为:

Magic Square:
 8 1 6
 3 5 7
 4 9 2
Row sums: 15 15 15
Column sums: 15 15 15
Diagonal sums:  15 15

IDEONE上的生活演示

注意:

从描述中实现这种算法,您可以很容易地被困。使用的描述根据插图使用"行","行"。因此,需要清晰的映射来定义有关矩阵存储的"向上"answers"向下"的意思。在我的情况下,"行"是 row降低,"行朝下"是 row增量。在这种特定情况下,它可能对链接的文章提到可以水平和垂直镜像。

,它也可能起作用。 。