マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第10章 関数の再帰的使用によって魔方陣を自動生成する
第7話 仮屋崎さんの天才的方法解説の解説その2
プログラムコード再掲
void 2次座標生成() {//y横座標とx縦座標生成
int i, j, c;
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;
}
c = n - 1;
for (i = 0; i < n; i++) {
if (a[i][n - 1 - i] == -1) {
c++;
a[i][n - 1 - i] = c;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
x[a[i][j]] = j;
y[a[i][j]] = i;
}
}
}

第1の要点で番号づけは終わりました。
私の旧プログラムでは、次の様に考えていました。
第2の要点は0と0(使っているソフトが異なるので同一に色にはできませんが、
を表している者として読んでください)、
0と0をいかに関連付けるかです。
以下(1と1、1と1)、(2と2、2と2)、(3と3、3と3)、(4と4、4と4)でこれは簡単です。
だから、
for(i = 0;i < n; i++){
y[i] = i;
x[i] = j;
}
この様に場合に応じて対応するのでは
(5と0、5と4)、(6と1、6と3)、(7と3、7と1)、(8と4、8と0)、(9と0,9と1)、(10と0,10と2)、・・・
といろいろなケースがあり私のコードは複雑になる一方でした。
ところが、仮屋崎さんは
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
x[a[i][j]] = j;
y[a[i][j]] = i;
}
}
の一つの方式でかたずけてしまいました。
これが第2の要点です。