第10講 関数の再帰的使用による魔方陣の自動生成
第2話 n次方陣自動生成ソフト
実行画面が
これはすべてのn次方陣を求めるソフトです。
何次の方陣を発生させるのかをnに入力し
エンターするとn次方陣がすべて生成されます。
n=2
1 2
3 4

1 2
4 3

1 3
2 4

1 3
4 2

1 4
2 3

1 4
3 2

2 1
3 4

2 1
4 3

2 3
1 4

2 3
4 1

2 4
1 3

2 4
3 1

3 1
2 4

3 1
4 2

3 2
1 4

3 2
4 1

3 4
1 2

3 4
2 1

4 1
2 3

4 1
3 2

4 2
1 3

4 2
3 1

4 3
1 2

4 3
2 1

生成された2次方陣は24個です。

をなるソフトコード例
#include<stdio.h>
void f(int g);
int x[25];
int n, cn;
int main() {
  printf("これはすべてのn次方陣を求めるソフトです。\n");
  printf("何次の方陣を発生させるのかをnに入力し\n");
  printf("エンターするとn次方陣がすべて生成されます。\n");
  printf("n=");
  scanf("%d", &n);
  cn = 0;
  f(0);
  printf("生成された%d次方陣は%d個です。\n", n,cn);
  return(0);
}
void f(int g) {
  int i, j,k, h;
  for (i = 0; i<n*n; i++) {
    if (g == 0)x[g] = i + 1;
    h = 1;
    if (g>0) {
      for (j = 0; j<g; j++) {
        if (x[j] == i + 1) {
          h = 0;
          break;
        }
      }
      if (h == 1)x[g] = i + 1;
    }
    if (h == 1) {
      if (g + 1 < n*n) {
        f(g + 1);
      }
      else {
        for (j = 0; j < n; j++) {
          for (k = 0; k < n; k++) {
            printf("%d ", x[n*j+k]);
          }
          printf("\n");
        }
        printf("\n");
        cn++;
      }
    }
  }
}

さて、さてこのn次方陣生成ソフトを、
段階を踏んでn次魔方陣生成ソフトに近づけていきます。
まず、行(横)合計が一致する方陣を准准魔方陣と名付けて、
准准魔方陣を生成しましょう。

n次魔方陣では横合計・縦合計・対角線は
n×(n×n+1)÷2になることをヒントとしておきます。
どうしてかと申しますと、方陣のすべての数の和は
1+2+3+・・・+n×n=n×n×(n×n+1)÷2
であり、それを行数のnで割るからです。
1+2+3+・・・+n×nの答えがn×n×(n×n+1)÷2となる理由は、
1   +   2    +   3    + ・・・ + n×n を逆順に並べたものを考え
n×n+(n×n−1)+(n×n−2)+ ・・・  + 1
両者を加えれば、n×n×(n×n+1)ですよね。
これは求める和の2倍ですから、
最後2で割れば求める和になるのです。

3次以上ではより条件の厳しい魔方陣でさえ存在しますので、
准准魔方陣の存在は自明ですが、
はたして2次の准准魔方陣は存在するのでしょうか。




第1話へ   第3話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc** c言語 c** 入門 初心者 基礎から応用まで
eclipse c** 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C**入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC**による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ