第8講 4次魔方陣と6次魔方陣の作成
第6話 対角線交換関数for文版コードと解説その1

void h(int **x){
  int w,i;
  for(i=0;i<2;i++){
    w=x[i][i];
    x[i][i]=x[3-i][3-i];
    x[3-i][3-i]=w;
  }
  for(i=0;i<2;i++){
    w=x[i][3-i];
    x[i][3-i]=x[3-i][i];
    x[3-i][i]=w;
  }
}
コピペ用添付ファイル

解説
トレースしてみましょう。
色の対応に気をつけながら読んでください。
尚、プログラミングでは行(横列)→列(縦列)の順で考えますから、
座標(
)は、が行番号(縦軸)に対応し、
が列番号(横軸)に対応しています。
数学の座標は(横軸、縦軸)であるのとは反対で(
縦軸横軸)となっています。
ですから、 座標()は

  0
0
1
2 10 11 12
3 13 14 15 16

茶色のセル(ます)をあらわします。
すなわち、10が入っているセル(ます)です。


i=0のとき、
    w=x[i][i];
 は
    w=x[0][0];
 ですから、

  0
0
1
2 10 11 12
3 13 14 15 16

 座標()の1がwに収納されます。
    x[i][i]=x[3-i][3-i];
 は、i=0ですから、

    x[0][0]=x[3-0][3-0];
 すなわち、
    x[0][0]=x[3][3];
 となり、

  0
0
1
2 10 11 12
3 13 14 15 16

 座標()の16が座標()に収納されて、

  0
0 16
1
2 10 11 12
3 13 14 15 16

 となります。
    x[3-i][3-i]=w;
 は、i=0ですから、
    x[3-0][3-0]=w;
 すなわち、
    x[3][3]=w;
 ですから、
 座標(
)に(wに収納されていた1)が入ります。

  0
0 16
1
2 10 11 12
3 13 14 15


i=1のとき、
    w=x[i][i];
 は
    w=x[1][1];
 ですから、

  0
0 16
1
2 10 11 12
3 13 14 15

 座標()の6がwに収納されます。
    x[i][i]=x[3-i][3-i];
 は、i=1ですから、

    x[1][1]=x[3-1][3-1];
 すなわち、
    x[1][1]=x[2][2];
 となり、

  0
0 16
1
2 10 11 12
3 13 14 15

 座標()の11が座標()に収納されて、

  0
0 16
1 11
2 10 11 12
3 13 14 15

 となります。
    x[3-i][3-i]=w;
 は、i=1ですから、
    x[
3-1][3-1]=w;
 すなわち、
    x[2][2]=w;
 となり、
 座標(
)に(wに収納されていた6)が入ります。

  0
0 16
1 11
2 10 12
3 13 14 15

 これで対角線部分の交換が成立します。






第5話へ 第7話へ

a


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

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

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