第18講 対角線法による魔方陣自動生成速度の1万倍加へ

第4話 座標作成関数(社員)コード

実行画面
n=7
00 13 14 15 16 17 07
18 01 19 20 21 08 22
23 24 02 25 09 26 27
28 29 30 03 31 32 33
34 35 10 36 04 37 38
39 11 40 41 42 05 43
12 44 45 46 47 48 06

を実現するプログラム例
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
void f(int g); //魔方陣を作り出す社員
void hy(); //出来た順列をコンソールに表示させる社員
void zy(); //座標作成社員
void hy1(int a[10][10]); //番号付けが上手くいっているかを確認する社員
int cn,n;
int m[5][5]; //少し大きめに配列要素数を取っておく
int main(){
  srand(1);
  printf("n=");
  fflush(0); //pirntfを先に実行させるためのお呪い
  scanf("%d",&n);
  cn=0;
  zy();
  //f(0);
  //printf("生成された%d次魔方陣=%d",n,cn);
}
void zy(){ //座標作成社員
  int a[10][10];
  int i,j,cn;
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      a[i][j]=-1;
    }
  }
  for(i=0;i<n;i++){
    a[i][i]=i;
  }
  cn=n;
  for(i=0;i<n;i++){
    if(a[i][n-1-i]==-1){
      a[i][n-1-i]=cn;
      cn++;
    }
  }
  for(i=0;i<n;i++){
    for(j=0j;j<n;j++){
      if(a[i][j]==-1){
        a[i][j]=cn;
        cn++;
      }
    }
  }
  hy1(a);
}
void hy1(int a[10][10]){
  int i,j;
  for(i=0;i<n;i++){
    for(j=0j;j<n;j++){
      if(a[i][j]<10)printf("0%d ",a[i][j]);
      if(a[i][j]>=10)printf("%d ",a[i][j]);
    }
    printf("\n");
  }
  printf("\n");
}
void f(int g){
      ・
番号付けまで

さて、
n=7
00 13 14 15 16 17 07
18 01 19 20 21 08 22
23 24 02 25 09 26 27
28 29 30 03 31 32 33
34 35 10 36 04 37 38
39 11 40 41 42 05 43
12 44 45 46 47 48 06

という複雑な番号付けに成功しました。

次は、この番号と座標との関連づけです。

   0
0 0 13 14 15 16 17 7
1 18 1 19 20 21 8 22
2 23 24 2 25 9 26 27
3 28 29 30 3 31 32 33
4 34 35 10 36 4 37 38
5 39 11 40 41 42 5 43
6 12 44 45 46 47 48 6

仮屋崎さんの方法とてもすばらしいのは、
ここです。
目の覚めるような方法です。

ヒントは・・・
  for(i=0;i<n;i++){
    for(j=0j;j<n;j++){
      y[・・・]=i;
      x[・・・]=j;
    }
  }
でできます。
そして、hy2(int a[10][10])も作り、
本当に座標作りが正しく出来ているかを確認する
社員g()も作りましょう。
void zy(){ //座標作成社員
  int a[10][10];
  int i,j,cn;
    ・・・
  for(i=0;i<n;i++){
    for(j=0j;j<n;j++){
      if(a[i][j]==-1){
        a[i][j]=cn;
        cn++;
      }
    }
  }
  for(i=0;i<n;i++){
    for(j=0j;j<n;j++){
      y[・・・]=i;
      x[・・・]=j;
    }
  }
  
g(); //hy1();が外してある
}
void hy1(int a[10][10]){
  int i,j;
  for(i=0;i<n;i++){
    for(j=0j;j<n;j++){
      if(a[i][j]<10)printf("0%d ",a[i][j]);
      if(a[i][j]>=10)printf("%d ",a[i][j]);
    }
    printf("\n");
  }
  printf("\n");
}
void g(){
  ・・・
  
hy1(a);
}
実行画面例
n=9
00 17 18 19 20 21 22 23 09
24 01 25 26 27 28 29 10 30
31 32 02 33 34 35 11 36 37
38 39 40 03 41 12 42 43 44
45 46 47 48 04 49 50 51 52
53 54 55 13 56 05 57 58 59
60 61 14 62 63 64 06 65 66
67 15 68 69 70 71 72 07 73
16 74 75 76 77 78 79 80 08




第3話へ 第5話へ

a


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

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ