簡體   English   中英

魔術方陣一些數字的錯誤放置

[英]magic square wrong placement of some numbers

我試圖創建一個簡單的3x3魔術方塊。 3x3幻方由連續的整數(從1開始,以9結束)組成,這些整數由“ n”列放入“ 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])

我從未聽說過Magic Squares,並向Wikipedia咨詢了有關它們。 不出所料,我發現了各種構建算法的描述。

我確定了de laLoubère的算法是OP顯然試圖實現的算法。 恕我直言,這種嘗試實際上還不錯。

我給出的提示(缺少行換行) if(magicsq[row][col]!=0) row++; for (x=2;x<3*3;x++) (缺少迭代步驟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生活示范

注意:

通過描述實現這種算法,您很容易陷入困境。 根據說明,描述使用“向上”,“向下”。 因此,需要清晰的映射來定義與矩陣存儲有關的“向上”和“向下”的含義。 在我的情況下,“ row up”是row減少,“ row down”是row增加。 在此特定情況下,它可能也相反,因為鏈接的文章提到結果矩陣可以水平和垂直鏡像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM