第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 |
と芸当のようなことができるのです。
C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)