第10講 関数の再帰的使用による魔方陣の自動生成
第4話 n次准魔方陣自動生成ソフト
n次准魔方陣生成ソフトコード例
#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,hh,w;
  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 {
        hh=1;
        for (j = 0; j < n; j++) {
          w=0;
          for (k = 0; k < n; k++) {
            w+=x[n*j+k];
          }
          if(w!=n*(n*n+1)/2){
            hh=0;
            break;
          }
        }
        
if(hh==1){
          for (j = 0; j < n; j++) {
            w=0;
            for (k = 0; k < n; k++) {
              w+=x[n*k+j];
            }
            if(w!=n*(n*n+1)/2){
              hh=0;
              break;
            }
          }
        }

        if(hh==1){
          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=2
生成された2次准魔方陣は0個です。

これはすべてのn次准魔方陣を求めるソフトです。
何次の准魔方陣を発生させるのかをnに入力し
エンターするとn次准魔方陣がすべて生成されます。
n=3
1 5 9
6 7 2
8 3 4

1 5 9
8 3 4
6 7 2

1 6 8
5 7 3
9 2 4

1 6 8
9 2 4
5 7 3

1 8 6
5 3 7
9 4 2

1 8 6
9 4 2
5 3 7

1 9 5
6 2 7
8 4 3

1 9 5
8 4 3
6 2 7

2 4 9
6 8 1
7 3 5

2 4 9
7 3 5
6 8 1

2 6 7
4 8 3
9 1 5

2 6 7
9 1 5
4 8 3

2 7 6
4 3 8
9 5 1

2 7 6
9 5 1
4 3 8

2 9 4
6 1 8
7 5 3

2 9 4
7 5 3
6 1 8

3 4 8
5 9 1
7 2 6

3 4 8
7 2 6
5 9 1

3 5 7
4 9 2
8 1 6

3 5 7
8 1 6
4 9 2

3 7 5
4 2 9
8 6 1

3 7 5
8 6 1
4 2 9

3 8 4
5 1 9
7 6 2

3 8 4
7 6 2
5 1 9

4 2 9
3 7 5
8 6 1

4 2 9
8 6 1
3 7 5

4 3 8
2 7 6
9 5 1

4 3 8
9 5 1
2 7 6

4 8 3
2 6 7
9 1 5

4 8 3
9 1 5
2 6 7

4 9 2
3 5 7
8 1 6

4 9 2
8 1 6
3 5 7

5 1 9
3 8 4
7 6 2

5 1 9
7 6 2
3 8 4

5 3 7
1 8 6
9 4 2

5 3 7
9 4 2
1 8 6

5 7 3
1 6 8
9 2 4

5 7 3
9 2 4
1 6 8

5 9 1
3 4 8
7 2 6

5 9 1
7 2 6
3 4 8

6 1 8
2 9 4
7 5 3

6 1 8
7 5 3
2 9 4

6 2 7
1 9 5
8 4 3

6 2 7
8 4 3
1 9 5

6 7 2
1 5 9
8 3 4

6 7 2
8 3 4
1 5 9

6 8 1
2 4 9
7 3 5

6 8 1
7 3 5
2 4 9

7 2 6
3 4 8
5 9 1

7 2 6
5 9 1
3 4 8

7 3 5
2 4 9
6 8 1

7 3 5
6 8 1
2 4 9

7 5 3
2 9 4
6 1 8

7 5 3
6 1 8
2 9 4

7 6 2
3 8 4
5 1 9

7 6 2
5 1 9
3 8 4

8 1 6
3 5 7
4 9 2

8 1 6
4 9 2
3 5 7

8 3 4
1 5 9
6 7 2

8 3 4
6 7 2
1 5 9

8 4 3
1 9 5
6 2 7

8 4 3
6 2 7
1 9 5

8 6 1
3 7 5
4 2 9

8 6 1
4 2 9
3 7 5

9 1 5
2 6 7
4 8 3

9 1 5
4 8 3
2 6 7

9 2 4
1 6 8
5 7 3

9 2 4
5 7 3
1 6 8

9 4 2
1 8 6
5 3 7

9 4 2
5 3 7
1 8 6

9 5 1
2 7 6
4 3 8

9 5 1
4 3 8
2 7 6

生成された3次准魔方陣は72個です。


なんと2次准魔方陣は存在せず、、
3次准魔方陣は72個存在することがわかりました。

さて、いよいよ最後の条件の対角線合計を付け加えて、
魔方陣生成ソフトを作りましょう。



第3話へ   第5話へ

002

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

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