第5講 第4講で完成させたプログラムコードの解説
第7話 トレース③
主要部分再掲
void kyokusyokaiseki(int y, int x) {//局所解析 = 単セルリスト構造解析
  for (int i = 0; i < n; i++)lst[y][x][i] = i + 1;//初期化{1,2,3,4,5,6,7,8,9}とする
  mx[y][x] = 0;//{1,2,3,4,5,6,7,8,9}を{2,4}等にするために0に初期化 再カウントのため

  for (int i = 0; i < n; i++) {//mondai[y][x]と同じ行にある
セルからの影響を調べる
    if (i != x) {//自分自身は対象にしない
      if (mondai[y][i] > 0) {
        for (int j = 0; j < n; j++) {
          if (lst[y][x][j] == mondai[y][i])lst[y][x][j] = 0;
          //mondai[y][i]と一致する数字を0にすることによって候補から外す
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {//mondai[y][x]と同じ列にある
セルからの影響を調べる
    if (i != y) {
      if (mondai[i][x] > 0) {
        for (int j = 0; j < n; j++) {
          if (lst[y][x][j] == mondai[i][x])lst[y][x][j] = 0;
          //mondai[i][x]と一致する数字を0にすることによって候補から外す
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {//mondai[y][x]と同じブロックにあるセルからの影響を調べる
    if (3 * (y / 3) + (i / 3) != y && 3 * (x / 3) + (i % 3) != x) {
      if (mondai[3 * (y / 3) + (i / 3)][3 * (x / 3) + (i % 3)] > 0) {
        for (int j = 0; j < n; j++) {
          if (lst[y][x][j] == mondai[3 * (y / 3) + (i / 3)][3 * (x / 3) + (i % 3)])lst[y][x][j] = 0;
          //mondai[3 * (y / 3) + (i / 3)][3 * (x / 3) + (i % 3)]と一致する数字を
          //0にすることによって候補から外す
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (lst[y][x][i] > 0) {
      lst[y][x][mx[y][x]] = lst[y][x][i];
      mx[y][x]++;
    }
  }
}

列やブロックについても第5話・第6話で展開してきたトレースをやりたいところですが、

それをやると

『中級者ためのVisual Studio Community 2022 C++による
マルチスレッド版数独自動生成ソフトの開発解説講座』

という名称に反しているではないかと思う人もいるでしょうから、それは断念して

この図から座標(0, 2)の候補数字を考えましょう。

{0, 0, 3, 0, 0, 0, 0, 0, 0}となることはお分かりか思います。

以下は、中級者にとって不要な説明だと思いますので第8話に進んでください。

  for (int i = 0; i < n; i++) {
    if (lst[y][x][i] > 0) {
      lst[y][x][mx[y][x]] = lst[y][x][i];
      mx[y][x]++;
    }
  }
の動きを追ってみましょう。

i = 0のとき

    if (lst[0][1][0] > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][0];
  {
0, 0, 3, 0, 0, 0, 0, 0, 0}から
    if (
0 > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][0];
      mx[0][1]++;
    }
  となり何もされません。

i = 1のとき

    if (lst[0][1][1] > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][1];
      mx[y][x]++;
    }
  から{0,
0, 3, 0, 0, 0, 0, 0, 0}から
    if (0 > 0) {
      lst[0][1][mx[y][x]] = lst[0][1][1];
      mx[0][1]++;
    }
  となり何もされません。

i = 2のとき

    if (lst[0][1][1] > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][2];
      mx[0][1]++;
    }
  から{0, 0,
3, 0, 0, 0, 0, 0, 0}から
    if (3 > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][2];
      mx[0][1]++;
    }
  初めて{}内が実行され
  lst[0][1][0] = 3
  mx[0][1] = 1


i = 4のとき

    if (lst[0][1][1] > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][4];
      mx[y][x]++;
    }
  から{0, 0, 3,
0, 0, 0, 0, 0, 0}から
    if (0 > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][4];
      mx[0][1]++;
    }
  となり何もされません。


i = 6のとき

    if (lst[0][1][1] > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][6];
      mx[y][x]++;
    }
  から{0, 0, 3,
0, 0, 0, 0, 0, 0}から
    if (0 > 0) {
      lst[0][1][mx[y][x]] = lst[0][1][6];
      mx[0][1]++;
    }
  となり何もされません。

i = 7のとき

    if (lst[0][1][1] > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][7];
      mx[y][x]++;
    }
  から{0, 0, 3,
0, 0, 0, 0, 0, 0}から
    if (0 > 0) {
      lst[0][1][mx[y][x]] = lst[0][1][7];
      mx[0][1]++;
    }
  となり何もされません。

i = 8のとき

    if (lst[0][1][1] > 0) {
      lst[0][1][mx[0][1]] = lst[0][1][8];
      mx[y][x]++;
    }
  から{0, 0, 3,
0, 0, 0, 0, 0, 0}から
    if (0 > 0) {
      lst[0][1][mx[y][x]] = lst[0][1][8];
      mx[0][1]++;
    }
  となり何もされません。

以上より{3}でmx[0][1] = 1です。

正しいことをこの図で確認してください。



第6話へ 第8話へ

トップへ