第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です。
正しいことをこの図で確認してください。