第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)番目,0は0座標(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}となりました。
私も疲れましたが、読んできた皆さんも相当お疲れだと思います。本当にご苦労様です。