2017-02-08 1 views
0

私は基本的に2次元配列のサイズn x nの要素を1〜n^2の範囲にあるマジックスクエアを生成するいくつかのコードに取り組んできましたが、それぞれの列、行、複数の2D Magic Squareアレイを作成するにはどうすればよいですか?

これまで私がこれまで持っていたのは、問題は毎回同じ2dアレイを作成するということです。私は、一番右の中央の行に1を置くことから始めます。これと同じ方法で私は3つの魔方陣を作ることができますか?

std::cout << "Enter the size of a magic square: \n"; 
    int n; 
    std::cin >> n; 
    int magicSquare[n][n]; 

    // set all slots as 0 
    memset(magicSquare, 0, sizeof(magicSquare)); 

    // Initialize position for 1 
    int row = n/2; 
    int col = n-1; 


    for (int num=1; num <= n*n;) 
    { 
     if (row==-1 && col==n) 
     { 
      row = 0; 
      col = n-2; 
     } 
     else 
     { 

      if (col == n) 
       col = 0; 

      if (row < 0) 
       row=n-1; 
     } 
     if (magicSquare[row][col]) 
     { 
      col -= 2; 
      row++; 
      continue; 
     } 
     else 
      magicSquare[row][col] = num++; 

     col++; 
     row--; 
    } 

答えて

1

はい、可能です。魔方陣はreflection symmetryです。

としてあなたは、追加の魔方陣を作るために、このプロパティを利用することができます

2 9 4 
7 5 3 
6 1 8 

1:

ここでは正方形、あなたのプログラムで生成されたベース 3x3の魔法です同じ正方形は水平方向にミラーされます

4 9 2 
3 5 7 
8 1 6 

+2:元の正方形を垂直ミラーリング:

6 1 8 
7 5 3 
2 9 4 

+3:元の正方形は、水平及び垂直ミラーリング:

8 1 6 
3 5 7 
4 9 2 

すべて魔方陣の性質を満たします。

+0

対角軸に沿ってミラーリングすることもできます。さらに2つの魔方陣が得られます。 – Steeve

関連する問題