第5講 第4講で完成させたプログラムコードの解説
第6話 トレース②
主要部分再掲
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];//例えば、{0, 2, 0, 4, 0, 0, 0, 0, 0}を{2, 4}と詰めて0を含めない
      mx[y][x]++;
    }
  }
}

現時点で
外された候補数字は1, 2, 5です。したがって、セル赤の候補数字は{0,0,3,4,0,6,7,8,9}です。

i = 6 のとき (y = 0, x = 2)が前提
  
j = 0のとき (y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][0] == mondai[0][6])lst[0][2][0] = 0;
          if (0 ==
0)lst[0][2][0] = 0;
          //0{0,0,3,4,0,6,7,8,9}の(0 + 1)番目,0座標(0, 6)の内容の0
          0 == 0が成り立ちlst[0][2][0] = 0;が実行されますがもともと0なので{0,0,3,4,0,6,7,8,9}      
  j = 1のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][1] == mondai[0][6])lst[0][2][1] = 0;
          if (0 == 0)lst[0][2][1] = 0;
          //0{0,0,3,4,0,6,7,8,9}の(1 + 1)番目,00座標(0, 6)の内容の0
          成立してlst[0][2][1] = 0;が実行されるがもともと0なので何もしないと同じで{0,0,3,4,0,6,7,8,9}
  j = 2のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][2] == mondai[0][6])lst[0][2][2] = 0;
          if (3 == 0)lst[0][2][2] = 0;
          //3{0,0,3,4,0,6,7,8,9}の(2 + 1)番目,0座標(0, 6)の内容の0
          3 == 0は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}
  j = 3のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][3] == mondai[0][6])lst[0][2][3] = 0;
          if (4 == 0)lst[0][2][3] = 0;
          //4{0,0,3,4,0,6,7,8,9}の(3 + 1)番目,0座標(0, 6)の内容の0
          4 == 2は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}
  j = 4のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][4] == mondai[0][6])lst[0][2][4] = 0;
          if (0 == 0)lst[0][2][4] = 0;
          //0{0,0,3,4,0,6,7,8,9}の(4 + 1)番目,0座標(0, 6)の内容の0
          成立してlst[0][2][4] = 0;が実行されますがもともと0なので{0,0,3,4,0,6,7,8,9}
  j = 5のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][5] == mondai[0][6])lst[0][2][5] = 0;
          if (6 == 5)lst[0][2][5] = 0;
          //6{0,0,3,4,0,6,7,8,9}の(5 + 1)番目,0座標(0, 6)の内容の0
          6 == 5は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}
  j = 6のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][6] == mondai[0][6])lst[0][2][6] = 0;
          if (7 == 0)lst[0][2][6] = 0;
          //7{0,0,3,4,0,6,7,8,9}の(6 + 1)番目,0座標(0, 6)の内容の0
          7 == 0は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}

  j = 7のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][7] == mondai[0][6])lst[0][2][7] = 0;
          if (8 == 0)lst[0][2][6] = 0;
          //7{0,0,3,4,0,6,7,8,9}の(7 + 1)番目,0座標(0, 6)の内容の0
          7 == 0は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}

  j = 8のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][8] == mondai[0][6])lst[0][2][8] = 0;
          if (9 == 0)lst[0][2][6] = 0;
          //9{0,0,3,4,0,6,7,8,9}の(8 + 1)番目,0座標(0, 6)の内容の0
          9 == 0は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}


i = 7 のとき (y = 0, x = 2)が前提
  
j = 0のとき (y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][0] == mondai[0][7])lst[0][2][0] = 0;
          if (0 ==
8)lst[0][2][0] = 0;
          //0{0,0,3,4,0,6,7,8,9}の(0 + 1)番目,8座標(0, 7)のセルの内容の8
    0 == 8が成立しないので何もされず{0,0,3,4,0,6,7,8,9}      
  j = 1のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][1] == mondai[0][7])lst[0][2][1] = 0;
          if (0 == 8)lst[0][2][1] = 0;
         //0{0,0,3,4,0,6,7,8,9}の(1 + 1)番目,8座標(0, 7)の内容の8
         0 == 8が成立しないので何もされず{0,0,3,4,0,6,7,8,9}
  j = 2のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][2] == mondai[0][7])lst[0][2][2] = 0;
          if (3 == 8)lst[0][2][2] = 0;
          //3{0,0,3,4,0,6,7,8,9}の(2 + 1)番目,8座標(0, 7)の内容の8
          3 == 8は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}
  j = 3のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][3] == mondai[0][2])lst[0][2][3] = 0;
          if (4 == 8)lst[0][2][3] = 0;
          //4{0,0,3,4,0,6,7,8,9}の(3 + 1)番目,8座標(0, 7)の内容の8
          4 == 2は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}
  j = 4のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][4] == mondai[0][7])lst[0][2][4] = 0;
          if (0 == 8)lst[0][2][4] = 0;
          //0{0,0,3,4,0,6,7,8,9}の(4 + 1)番目,8座標(0, 7)の内容の8
          成立せず{0,0,3,4,0,6,7,8,9}
  j = 5のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][5] == mondai[0][2])lst[0][2][5] = 0;
          if (6 == 8)lst[0][2][5] = 0;
          //6{0,0,3,4,0,6,7,8,9}の(5 + 1)番目,8座標(0, 7)の内容の8
          6 == 8は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}
  j = 6のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][6] == mondai[0][7])lst[0][2][6] = 0;
          if (7 == 8)lst[0][2][6] = 0;
          //7{0,0,3,4,0,6,7,8,9}の(6 + 1)番目,8座標(0, 7)の内容の8
          7 == 8は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}


  j = 7のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][7] == mondai[0][7])lst[0][2][7] = 0;
          if (8 == 8)lst[0][2][6] = 0;
           //8{0,0,3,4,0,6,7,8,9}の(7 + 1)番目,8座標(0, 7)の内容の8
          成立してlst[0][2][6] = 0;が実行されて{0,0,3,4,0,6,7,0,9}
 8が候補数字から外された!

  j = 8のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][8] == mondai[0][7])lst[0][2][8] = 0;
          if (9 == 8)lst[0][2][6] = 0;
          //9{0,0,3,4,0,6,7,0,9}の(8 + 1)番目,8座標(0, 7)の内容の8
          9 == 8は正しくないので何もされずに{0,0,3,4,0,6,7,0,9}


i = 8 のとき (y = 0, x = 2)が前提
  
j = 0のとき (y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][0] == mondai[0][8])lst[0][2][0] = 0;
          if (0 ==
9)lst[0][2][0] = 0;
          //0{0,0,3,4,0,6,7,0,9}の(0 + 1)番目,9座標(0,
8)の内容の9
          0 == 9が成立しないので何もされず{0,0,3,4,0,6,7,0,9}      
  j = 1のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][1] == mondai[0][8])lst[0][2][1] = 0;
          if (0 == 9)lst[0][2][1] = 0;
          //0{0,0,3,4,0,6,7,0,9}の(1 + 1)番目,9座標(0, 8)の内容の9
          0 == 9が成立しないので何もされず{0,0,3,4,0,6,7,0,9}
  j = 2のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][2] == mondai[0][8])lst[0][2][2] = 0;
          if (3 == 9)lst[0][2][2] = 0;
          //3{0,0,3,4,0,6,7,0,9}の(2 + 1)番目,9座標(0, 8)の内容の9
          3 == 9は正しくないので何もされずに{0,0,3,4,0,6,7,0,9}
  j = 3のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][3] == mondai[0][2])lst[0][2][3] = 0;
          if (4 == 9)lst[0][2][3] = 0;
          //4{0,0,3,4,0,6,7,0,9}の(3 + 1)番目,9座標(0, 8)の内容の9
          4 == 9は正しくないので何もされずに{0,0,3,4,0,6,7,0,9}
  j = 4のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][4] == mondai[0][8])lst[0][2][4] = 0;
          if (0 == 9)lst[0][2][4] = 0;
          //0{0,0,3,4,0,6,7,0,9}の(4 + 1)番目,9座標(0, 8)の内容の9
          成立せず{0,0,3,4,0,6,7,8,9}
  j = 5のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][5] == mondai[0][2])lst[0][2][5] = 0;
          if (6 == 9)lst[0][2][5] = 0;
          //6{0,0,3,4,0,6,7,0,9}の(5 + 1)番目,9座標(0, 8)の内容の9
          6 == 9は正しくないので何もされずに{0,0,3,4,0,6,7,0,9}
  j = 6のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][6] == mondai[0][8])lst[0][2][6] = 0;
          if (7 == 9)lst[0][2][6] = 0;
          //7{0,0,3,4,0,6,7,0,9}の(6 + 1)番目,9座標(0, 8)の内容の9
          7 == 9は正しくないので何もされずに{0,0,3,4,0,6,7,0,9}


  j = 7のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][7] == mondai[0][8])lst[0][2][7] = 0;
          if (9 == 9)lst[0][2][6] = 0;
          //9{0,0,3,4,0,6,7,8,9}の(7 + 1)番目,9座標(0, 8)の内容の9
          成立してlst[0][2][6] = 0;が実行されて{0,0,3,4,0,6,7,0,9}
 9が候補数字から外された!

  j = 8のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,0,9}
          if (lst[0][2][8] == mondai[0][7])lst[0][2][8] = 0;
          if (9 == 9)lst[0][2][6] = 0;
          //9{0,0,3,4,0,6,7,0,9}の(8 + 1)番目,9座標(0, 8)の内容の9
          9 == 9は正しくないのでlst[0][2][6] = 0;{0,0,3,4,0,6,7,0,0}
 9が候補数字から外された!



これでめでたく座標(0, 2)の候補数字から1, 2, 5, 8, 9が外され{0,0,3,4,0,6,7,0,0}となりました。

私も疲れましたが、読んできた皆さんも相当お疲れだと思います。本当にご苦労様です。



第5話へ 第7話へ

トップへ