第14講 4次及び6次魔方陣の作成
第4話 対角線の交換プログラム解説
手順
Ⅱ 対角線の交換による魔方陣の完成

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16


16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

解答コード主要部分再掲
  public static void g(int a[][]){
    int i,w;
    for(i=0;i<2;i++){
      w=a[i][i];
      a[i][i]=a[3-i][3-i];
      a[3-i][3-i]=w;
    }
    for(i=0;i<2;i++){
      w=a[i][3-i];
      a[i][3-i]=a[3-i][i];
      a[3-i][i]=w;
    }
  }
解説
ある程度プログラミングの経験のある方でも、
結構難解なプログラムですから、初心者の方には???でしょうね。
そこで、詳しくとレースをしましょう。
まず、
    for(i=0;i<2;i++){
      w=a[i][i];
      a[i][i]=a[3-i][3-i];
      a[3-i][3-i]=w;
    }
の部分の動きを追ってみましょう。
トレースする際に、色対応に気をつけてください。

   0 1 2 3
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16

i=0のとき、
      w=a[i][i];

      w=a[0][0];
ですから、

   0 1 2 3
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16

座標()の値1がwに収納されます。

次に、
      a[i][i]=a[3-i][3-i];

      a[0][0]=a[3-0][3-0]=a[3][3];
ですから、

   0 1 2 3
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16

座標()の16が座標()に代入されて

   0 1 2 3
0 16 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16

となります。
そして、
      a[3-i][3-i]=w;

      a[3-0][3-0]=a[3][3]=w;
座標()にwの値1が代入されて

   0 1 2 3
0 16 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 1

となります。座標()と座標()の交換に成功しました。
一時的に値を収納するボックスwが働いています。

i=1のとき、
      w=a[i][i];

      w=a[1][1];

   0 1 2 3
0 16 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 1

座標()の値6がボックスwに収納されます。

次の行
      a[i][i]=a[3-i][3-i];

      a[1][1]=a[3-1][3-1]=a[2][2];
ですから、

   0 1 2 3
0 16 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 1

座標()の値11が座標()に代入されて

   0 1 2 3
0 16 2 3 4
1 5 11 7 8
2 9 10 11 12
3 13 14 15 1

となります。3行目
      a[3-i][3-i]=w;

      a[3-1][3-1]=a[2][2]=w;

なので、一時収納ボックスwの値2が座標()に代入されて

   0 1 2 3
0 16 2 3 4
1 5 11 7 8
2 9 10 2 12
3 13 14 15 1

座標()と座標()の交換に成功しました。






第3話へ 第5話へ

戻る

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

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部