第5講 第4講で完成させたプログラムコードの解説
第5話 トレース①
主要部分再掲
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]++;
    }
  }
}

i = 2 のとき (y = 0, x = 2)が前提
    if (
2 != 2) {//自分自身は対象にしない
    が満たされず以降は実行されません。
i = 3 のとき (y = 0, x = 2)が前提
    if (3 != 2) {//自分自身は対象にしない
  は満たされますが、
      if (mondai[0][3] > 0) { //0座標(0, 1)のセルの内容の0 空欄は0であることに注意
      if (0 > 0) { //0座標(0, 1)の0 
    0 > 0が成立しないで以降は実行されずに{0,0,3,4,5,6,7,8,9}のまま
i = 4 のとき (y = 0, x = 2)が前提
  
j = 0のとき (y = 0, x = 2)の数字候補は{0,0,3,4,5,6,7,8,9}
          if (lst[0][2][0] == mondai[0][4])lst[0][2][0] = 0;
          if (0 ==
5)lst[0][2][0] = 0;
          //0{0,0,3,4,5,6,7,8,9}の(0 + 1)番目,5座標(0, 4)のセルの内容の5
    0 == 5成立しないので以降実行されずに{0,0,3,4,5,6,7,8,9}のまま       
  j = 1のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,5,6,7,8,9}
          if (lst[0][2][1] == mondai[0][4])lst[0][2][1] = 0;
          if (0 == 5)lst[0][2][1] = 0; 
          //0{0,0,3,4,5,6,7,8,9}の(1 + 1)番目,5座標(0, 4)のセルの内容の5
  によって成立しないので以降実行されずに{0,0,3,4,5,6,7,8,9}のまま
  j = 2のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,5,6,7,8,9}
          if (lst[0][2][2] == mondai[0][4])lst[0][2][2] = 0;
          if (3 == 5)lst[0][2][2] = 0;
          //3{0,0,3,4,5,6,7,8,9}の(2 + 1)番目,5座標(0, 4)のセルの内容の5
          3 == 5は正しくないので何もされずに{0,0,3,4,5,6,7,8,9}
  j = 3のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,5,6,7,8,9}
          if (lst[0][2][3] == mondai[0][4])lst[0][2][3] = 0;
          if (4 == 5)lst[0][2][3] = 0;
          //4{0,0,3,4,5,6,7,8,9}の(3 + 1)番目,5座標(0, 4)のセルの内容の5
          4 == 5は正しくないので何もされずに{0,0,3,4,5,6,7,8,9}
  j = 4のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,5,6,7,8,9}
          if (lst[0][2][4] == mondai[0][4])lst[0][2][4] = 0;
          if (5 == 5)lst[0][2][4] = 0;
          //5{0,0,3,4,5,6,7,8,9}の(4 + 1)番目,5座標(0, 4)のセルの内容の5
          成立するのでlst[0][2][4] = 0;実行され{0,0,3,4,0,6,7,8,9}候補数字5が外された!
  j = 5のとき ((y = 0, x = 2)の数字候補は{0,0,3,4,0,6,7,8,9}
          if (lst[0][2][5] == mondai[0][4])lst[0][2][5] = 0;
          if (6 == 2)lst[0][2][5] = 0;
          //0{0,0,3,4,5,6,7,8,9}の(5 + 1)番目,5座標(0, 4)のセルの内容の5
          6 == 2は正しくないので何もされずに{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][4])lst[0][2][6] = 0;
          if (7 == 5)lst[0][2][6] = 0;
          //0{0,0,3,4,5,6,7,8,9}の(6 + 1)番目,5座標(0, 4)のセルの内容の5
          7 == 5は正しくないので何もされずに{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][4])lst[0][2][7] = 0;
          if (8 == 5)lst[0][2][7] = 0;
          //8{0,0,3,4,5,6,7,8,9}の(7 + 1)番目,5座標(0, 4)のセルの内容の5
          8 == 5は正しくないので何もされずに{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][5] == mondai[0][4])lst[0][2][5] = 0;
          if (9 == 5)lst[0][2][8] = 0;
          //9{0,0,3,4,5,6,7,8,9}の(8 + 1)番目,5座標(0, 4)のセルの内容の5
          9 == 5は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}

i = 5 のとき (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][5])lst[0][2][0] = 0;
          if (0 ==
0)lst[0][2][0] = 0;
          //0{0,0,3,4,5,6,7,8,9}の(0 + 1)番目,0座標(0, 5)のセルの内容の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][5])lst[0][2][1] = 0;
          if (0 == 0)lst[0][2][1] = 0;
         //0{0,0,3,4,5,6,7,8,9}の(1 + 1)番目,0座標(0, 5)のセルの内容の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,5,6,7,8,9}
          if (lst[0][2][2] == mondai[0][5])lst[0][2][2] = 0;
          if (3 == 0)lst[0][2][2] = 0;
          //3{0,0,3,4,5,6,7,8,9}の(2 + 1)番目,0座標(0, 5)のセルの内容の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][5])lst[0][2][3] = 0;
          if (4 == 0)lst[0][2][3] = 0;
          //0{0,0,3,4,5,6,7,8,9}の(3 + 1)番目,0座標(0, 5)のセルの内容の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][2])lst[0][2][4] = 0;
          if (0 == 0)lst[0][2][4] = 0;
          //0{0,0,3,4,5,6,7,8,9}の(4 + 1)番目,0座標(0, 5)のセルの内容の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][5])lst[0][2][5] = 0;
          if (6 == 5)lst[0][2][5] = 0;
          //6{0,0,3,4,5,6,7,8,9}の(5 + 1)番目,0座標(0, 5)のセルの内容の0
                                                 //空欄は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][5])lst[0][2][6] = 0;
          if (7 == 0)lst[0][2][6] = 0;
          //7{0,0,3,4,5,6,7,8,9}の(6 + 1)番目,0座標(0, 5)のセルの内容の0
                                                 //空欄は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][5])lst[0][2][7] = 0;
          if (8 == 0)lst[0][2][7] = 0;
          //8{0,0,3,4,5,6,7,8,9}の(7 + 1)番目,0座標(0, 5)のセルの内容の0
                                                 //空欄は0です。
          8 == 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][5] == mondai[0][5])lst[0][2][5] = 0;
          if (9 == 0)lst[0][2][8] = 0;
          //9{0,0,3,4,5,6,7,8,9}の(8 + 1)番目,0座標(0, 5)ののセルの内容0
                                       //空欄は0です。
          9 == 0は正しくないので何もされずに{0,0,3,4,0,6,7,8,9}


後3過程( i が6, 7, 8)必要ですが、現時点で
1, 2, 5が除かれていることがわかります。
この作業は肩が凝りますし、ミスをします。
ミスについては気が付いた段階で直していますが、ミスがあったら教えていただけるとありがたいです。
fmut1621@hotmail.co.jp

第4話へ 第6話へ

トップへ