对于那些不熟悉经典魔方算法的人:魔方是一个二维数组(n x n),其中每个位置的数值在1和n ^ 2之间。每个值只能出现一次。此外,每一行,每一列和对角线的总和必须相同。输入应该是奇数,因为我正在编写奇数幻方解。

我已经解决了这个问题,但是到目前为止,它有一个未知的错误(逻辑输出?),在过去的一个小时中一直困扰着我。输出的值非常不正确。任何帮助将不胜感激:

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
  int n;

  cout<< "Please enter an odd integer: ";
  cin>>n;

  int MagicSquare[n][n];


  int newRow,
  newCol;

  // Set the indices for the middle of the bottom i
  int i =0 ;
  int j= n / 2;

  // Fill each element of the array using the magic array
  for ( int value = 1; value <= n*n; value++ )
  {
     MagicSquare[i][j] = value;
     // Find the next cell, wrapping around if necessary.
     newRow = (i + 1) % n;
     newCol = (j + 1) % n;
     // If the cell is empty, remember those indices for the
     // next assignment.
     if ( MagicSquare[newRow][newCol] == 0 )
     {
        i = newRow;
        j = newCol;
     }
     else
     {
        // The cell was full. Use the cell above the previous one.
        i = (i - 1 + n) % n;
     }

  }


  for(int x=0; x<n; x++)
  {
     for(int y=0; y<n; y++)
         cout << MagicSquare[x][y]<<" ";
     cout << endl;
  }
}

最佳答案

您忘记了将MagicSquare初始化为包含所有零:

  for(int i = 0; i < n; i++) {
    for(int j = 0; j < n; j++) {
      MagicSquare[i][j] = 0;
    }
  }

因此,此检查几乎总是会失败:
if ( MagicSquare[newRow][newCol] == 0 ) {
   i = newRow;
   j = newCol;
}

由于C/++不会为您将它们初始化为0。

关于c++ - 魔方程序(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4372554/

10-12 21:41