マルチスレッド版数独自動生成ソフト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の要点です。










第10章第6話へ 第10章8話へ

本講義トップへ