第17講 普遍版魔方陣自動生成プログラムの高速化 
第4話 仮屋崎座標作成プログラム解説その2
座標作成本体コード再掲
void f0(){
  int i,j,c;
  int b[10][10];
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      b[i][j]=-1;
    }
  }
  for(i=0;i<n;i++){
    b[i][i]=i;
  }
  c=n-1;
  for(i=0;i<n;i++){
    if(b[i][n-1-i]==-1){
      c++;
      b[i][n-1-i]=c;
    }
  }
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      if(b[i][j]==-1){
        c++;
        b[i][j]=c;
      }
    }
  }

  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      x[b[i][j]]=j;
      y[b[i][j]]=i;
    }
  }
}

解説


動きを追ってみましょう。
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      b[i][j]=-1;
    }
  }

-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1

最初全部のセルに-1が割り振られます。
そして、
  for(i=0;i<n;i++){
    b[i][i]=i;
  }
で対角線に0から(n-1)までが割り振られます。

0 -1 -1 -1 -1
-1 1 -1 -1 -1
-1 -1 2 -1 -1
-1 -1 -1 3 -1
-1 -1 -1 -1 4

次に、
  c=n-1;
  for(i=0;i<n;i++){
    if(b[i][n-1-i]==-1){
      c++;
      b[i][n-1-i]=c;
    }
  }
が実行されます。cは番号を割り振るカウンタです。
対角線の最後に(n-1)が割り振られていますので
c=n-1;
としてあります。
逆対角線上でセルに-1割り振られているときだけ、
c++;
が実行され、それがセル番号となります。
上の例では2のセルときだけ、if文は実行されませんので、

0 -1 -1 -1 5
-1 1 -1 6 -1
-1 -1 2 -1 -1
-1 7 -1 3 -1
8 -1 -1 -1 4

と番号割り振りがうまくいきます。
最後、
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      if(b[i][j]==-1){
        c++;
        b[i][j]=c;
      }
    }
  }
すなたち、行列の割り振りにおいても-1のときだけ
c++;
が実行され割り振られるので

0 9 10 11 5
12 1 13 6 14
15 16 2 17 18
19 7 20 3 21
8 22 23 24 4

と芸当のようなことができるのです。






第3話へ 第5話へ

戻る

C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)