用C++實現的數獨解題程序 SudokuSolver 2.6 的新功能及相關分析


SudokuSolver 2.6 的新功能及相關分析

SudokuSolver 2.6 的命令清單如下:

H:\Read\num\Release>sudoku.exe

Order please:

Sudoku Solver 2.6 2021/10/30 by readalps

Order List:
load-quiz <file>: load quiz from file
show: show quiz info
levels: show info about guess levels
run-mode [1|2|0]: query or change working mode
guess-mode [1|0]: query or change guessing mode step: step forward
run: run till the end or a new solution met
runtil <steps>: run till certain steps run
runrun <sum>: run till the end or certain new solutions met
bye: quit

Order please:

以 用C++實現的數獨解題程序 SudokuSolver 2.4 及實例分析 里用過的 另一道數獨題 為例說明一下 2.6 版的新功能:

005 300 000
800 000 020
070 010 500
400 005 300
010 070 006
003 200 080
060 500 009
004 000 030
000 009 700

最大猜測級別信息展示

H:\Read\num\Release>sudoku.exe

Order please:
load-quiz h:\s.txt
Quiz loaded.

Order please:
run
2) row 2 complete shrunken by group
...
81) Guess [1,7] level 9 at 1 out of 2
84) Guess [2,6] level 10 at 1 out of 2
87) row 9 complete shrunken by group
89) col 4 complete shrunken by group
92) Guess [4,2] level 11 at 1 out of 2
...
127) Guess [1,5] level 6 at 1 out of 2
145 327 698
839 654 127
672 918 543

496 185 372
218 473 956
753 296 481

367 542 819
984 761 235
521 839 764

Fine [steps:131, solution sum:1].
Run time: 131 milliseconds; steps: 131, solution sum: 1.
 Biggest level on this run(til): 11

Order please:

上面的示例是加載完 quiz 接着就給了一條 run 命令,即求出一個解時停下來。最后的 biggest level on this run(til): 11 信息輸出是新版增加的,給出在這次 run(或 runtil)命令的求解過程中出現過最大猜測級別是 11 級。這個信息可以很直觀地衡量數獨題的難度,猜測級別越大,難度越大。當然,另一個很直觀地衡量數獨題的難度的信息是求解步數。綜合這兩個信息就可以基本客觀地衡量數獨題的難度。

通過仔細查看 run 命令輸出的求解過程信息,可以看出達到猜測級別 11 是在走到 92 步時發生的,且只發生過一次(即降下來之后沒有再次升到過 11 級)。下面介紹一種更快更容易的方法來界定這個結論。

既然 131 步完成一個求解的過程中最大猜測級別為 11 級,考慮用二分法看走完前 131/2 = 65 步時的最大猜測級別是多少,具體如下:

Order please:
bye

H:\Read\num\Release>sudoku.exe

Order please: load-quiz h:\s.txt
Quiz loaded.

Order please: runtil 65
2) row 2 complete shrunken by group
...
At guess level 7 [1,8] 2 Run time: 129 milliseconds; steps: 65, solution sum: 0.
Biggest level on this run(til): 7
Order please:

 65 步時所經歷的最大猜測級別是 7。繼續用二分法,(66+130)/2 = 98,接着運行 runtil 98:

Order please: runtil 98
67) row 2 complete shrunken by group
...
At guess level 3 [2,3] 2 Run time: 109 milliseconds; steps: 98, solution sum: 0. Biggest level on this run(til): 11 Order please:

66 步到 98 步之間有過最大猜測級別 11。進一步用二分法縮小范圍,(66+98)/2 = 82:

Order please:
bye

H:\Read\num\Release>sudoku.exe

Order please: load-quiz h:\s.txt
Quiz loaded.

Order please: runtil 82
2) row 2 complete shrunken by group
...
At guess level 9 [1,7] 1
Run time: 96 milliseconds; steps: 82, solution sum: 0.
 Biggest level on this run(til): 9

Order please:

1 到 82 步之間最高猜測級別僅為 9,說明 11 級猜測發生在 83 步到 98 步之間,(83+98)/2 = 90,接着運行 runtil 90:

Order please: runtil 90
84) Guess [2,6] level 10 at 1 out of 2
...
At guess level 10 [2,6] 1
Run time: 55 milliseconds; steps: 90, solution sum: 0.
 Biggest level on this run(til): 10

Order please:

這時已經界定出 11 級猜測發生在 91 步到 98 步之間。直接接着運行 runtil 98,看一下這幾步的輸出信息即可知道 11 級猜測具體發生在哪一步:

Order please: runtil 98
92) Guess [4,2] level 11 at 1 out of 2
92) shrinking 8 from [8,7] went wrong
93) Forward guess [4,2] level 11 at 2 out of 2
93) shrinking 5 from [8,1] went wrong
94) Upward guess [2,6] level 10 at 2 out of 2
95) shrinking 5 from [9,9] went wrong
96) Upward guess [1,7] level 9 at 2 out of 2
96) shrinking 4 from blk[6,9] went wrong
97) Upward guess [1,5] level 8 at 2 out of 2
97) shrinking 7 from [2,9] went wrong
98) Upward guess [2,3] level 3 at 2 out of 2
...
At guess level 3 [2,3] 2
Run time: 100 milliseconds; steps: 98, solution sum: 0.
 Biggest level on this run(til): 11

Order please:

這樣,就輕易地界定出走到 92 步時達到了 11 級猜測。從隨后幾行輸出信息又可看出,第 11 級猜測的兩個候選值都會引發錯誤(went wrong),之后依次逐級下降到第 8 級,然后一下降到第 3 級。這個過程的具體分析放到后面。這里繼續界定最高的 11 級猜測有沒有再次發生。在走完 98 步的情形下,直接給一個 run 命令:

Order please:
run
102) row 3 complete shrunken by group
...
Fine [steps:131, solution sum:1].
Run time: 50 milliseconds; steps: 131, solution sum: 1.
 Biggest level on this run(til): 6

Order please:

 從 98 步到 131 步之間最大猜測級別為 6,不到 11 級。再給一次 run 命令:

Order please:
run
132) Forward guess [1,5] level 6 at 2 out of 2
...
Invalid quiz [steps:284] - no more solution (solution sum is 1)
Run time: 154 milliseconds; steps: 284, solution sum: 1.
 Biggest level on this run(til): 7

Order please:

從 132 步走到最后求解完成,期間最大猜測級別為 7。於是可以界定整個求解過程只有一次達到 11 級猜測。

levels 命令:查看當前各級猜測相關的信息

以下這段是上面 runtil 90 執行完之后的 runtil 98 的輸出信息:

92) Guess [4,2] level 11 at 1 out of 2
92) shrinking 8 from [8,7] went wrong
93) Forward guess [4,2] level 11 at 2 out of 2
93) shrinking 5 from [8,1] went wrong 94) Upward guess [2,6] level 10 at 2 out of 2 95) shrinking 5 from [9,9] went wrong 96) Upward guess [1,7] level 9 at 2 out of 2 96) shrinking 4 from blk[6,9] went wrong 97) Upward guess [1,5] level 8 at 2 out of 2 97) shrinking 7 from [2,9] went wrong 98) Upward guess [2,3] level 3 at 2 out of 2

以下借助新增的 levels 命令來具體分析一下這一段信息對應的行為。

92) Guess [4,2] level 11 at 1 out of 2

這一行是說對第 4 行第 2 列對應的空位的兩個候選值做 2 猜 1 的處理,在此之前已對 10 個空位做了猜值處理,所以這一次猜測屬於第 11 級猜測。從頭求解,用 runtil 90 進到當時的上下文:

Order please: runtil 90
...
76) Guess [1,5] level 8 at 1 out of 2
78) row 1 complete shrunken by group
81) Guess [1,7] level 9 at 1 out of 2
84) Guess [2,6] level 10 at 1 out of 2
87) row 9 complete shrunken by group
89) col 4 complete shrunken by group
645 327 198
831 954 627
279 618 543

406 095 370
910 073 056
753 200 980

367 502 019
094 700 030
000 039 760

Steps:90
Candidates: [4,2]: 2 8    [4,4]: 1 8    [4,9]: 1 2
[5,3]: 2 8    [5,4]: 4 8    [5,7]: 2 4
[6,5]: 4 6    [6,6]: 1 6    [6,9]: 1 4
[7,5]: 4 8    [7,7]: 4 8    [8,1]: 1 5
[8,5]: 6 8    [8,6]: 1 6    [8,7]: 2 8
[8,9]: 2 5    [9,1]: 1 5    [9,2]: 2 8
[9,3]: 2 8    [9,4]: 1 4    [9,9]: 4 5
The foremost cell with 2 candidate(s) at [4,2]

At guess level 10 [2,6] 1
Run time: 139 milliseconds; steps: 90, solution sum: 0.
 Biggest level on this run(til): 10

Order please:

從中可以看到,當時還有 21 個空位,且每個空位的候選值都是兩個,其中最靠前的位置是 [4,2],它的候選值集合為 {2, 8}。當時已處在猜測級別 10。對照上面的信息可知,隨后會在 [4,2] 位置進行第 11 級猜測。

運行 step 命令,新的上下文信息為:

Order please:
step
92) Guess [4,2] level 11 at 1 out of 2
645 327 198
831 954 627
279 618 543

426 095 370
910 073 056
753 200 980

367 502 019
094 700 030
000 039 760

Steps:92
Candidates:
[4,4]: 1 8    [4,9]: 1    [5,3]: 8
[5,4]: 4 8    [5,7]: 2 4    [6,5]: 4 6
[6,6]: 1 6    [6,9]: 1 4    [7,5]: 4 8
[7,7]: 4 8    [8,1]: 1 5    [8,5]: 6 8
[8,6]: 1 6    [8,7]: 2 8    [8,9]: 2 5
[9,1]: 1 5    [9,2]: 8    [9,3]: 2 8
[9,4]: 1 4    [9,9]: 4 5
The foremost cell with 1 candidate(s) at [4,9]

At guess level 11 [4,2] 1

Order please:

仔細看會發現這里有一個看似很蹊蹺的問題:90 步怎么直接跳到了 92 步,是不是程序有 bug,哪里多算了一次?

這個問題需要結合程序實現解釋一下,在走完 90 步時,上下文有如下一行信息:

The foremost cell with 2 candidate(s) at [4,2]

即所有的空位中,候選值個數最小為 2(實際上如上面所述,每個空位的候選值個數都為 2),不能直接填值,而這種情形下會調用 filterCandidates 接口嘗試對這些空位的候選值做收縮處理,前文所述的 grp 和 ply 收縮算法都在這個接口里施行,這個接口每調用一次,步數都會加一。因此,每當施行了 grp 和 ply 收縮算卻又不能達到完全收縮或不完全收縮時,對應的這一步就不會有任何輸出信息,隨后一步輸出新的猜測信息,故而造成視覺上的跳步錯覺。當然,程序可以再改進一下,讓 filterCandidates 在白忙一場時也輸出一行信息,刷一下存在感,比如:

91) No shrink happened

繼續上下文分析。因為 [4,2] 位置上已經填上了 2,此時還有 20 個空位,且其中有三個位置的候選值數量降為 1,即可以直接填值。下一步:

Order please:
step
92) shrinking 8 from [8,7] went wrong
93) Forward guess [4,2] level 11 at 2 out of 2
645 327 198
831 954 627
279 618 543

486 095 370
910 073 056
753 200 980

367 502 019
094 700 030
000 039 760

Steps:93
Candidates:
[4,4]: 1    [4,9]: 1 2    [5,3]: 2
[5,4]: 4 8    [5,7]: 2 4    [6,5]: 4 6
[6,6]: 1 6    [6,9]: 1 4    [7,5]: 4 8
[7,7]: 4 8    [8,1]: 1 5    [8,5]: 6 8
[8,6]: 1 6    [8,7]: 2 8    [8,9]: 2 5
[9,1]: 1 5    [9,2]: 2    [9,3]: 2 8
[9,4]: 1 4    [9,9]: 4 5
The foremost cell with 1 candidate(s) at [4,4]

At guess level 11 [4,2] 2

Order please:

提交 step 命令后輸出的頭兩行信息是:

92) shrinking 8 from [8,7] went wrong
93) Forward guess [4,2] level 11 at 2 out of 2

第一行是說從第 8 行第 7 列的空位上把其候選值 8 收縮掉時會出現矛盾,第二行是說對 [4,2] 空位上的猜值做調整,即填上第二個候選值。

第二行是好懂的,因為 92 步一開始猜測 [4,2] = 2,隨后在對其它空位填值時出現了矛盾,說明 [4,2] ≠ 2,於是接着猜測 [4,2] = 8。

具體看一下 [4,2] = 2 時怎么推出的矛盾。接着看 92 步時的上下文,在 [4,2] 填入 2 后,如下三個空位可以直接填值:

[4,9]: 1    [5,3]: 8
[9,2]: 8

即:

645 327 198
831 954 627
279 618 543
426 095 371
918 073 056
753 200 980
367 502 019
094 700 030
080 039 760

此時對剩余空位的候選值做調整處理,即對第 4 行、第 9 列、第 6 宮做去 1 處理;對第 5 行、第 3 列、第 4 宮做去 8 處理;對第 9 行、第 2 列、第 7 宮做去 8 處理):

[4,4]: 1 8
[5,4]: 4 8    [5,7]: 2 4    [6,5]: 4 6
[6,6]: 1 6    [6,9]: 1 4    [7,5]: 4 8
[7,7]: 4 8    [8,1]: 1 5    [8,5]: 6 8
[8,6]: 1 6    [8,7]: 2 8    [8,9]: 2 5
[9,1]: 1 5                  [9,3]: 2 8
[9,4]: 1 4    [9,9]: 4 5

對單候選值空位直接做填值處理,即有:

645 327 198
831 954 627
279 618 543
426 895 371
918 473 056
753 200 980
367 502 019
094 700 030
082 039 760

同上類似,再對剩余空位的候選值做調整處理:

              [5,7]: 2 4    [6,5]: 4 6
[6,6]: 1 6    [6,9]: 1 4    [7,5]: 4 8
[7,7]: 4 8    [8,1]: 1 5    [8,5]: 6 8
[8,6]: 1 6    [8,7]: 2 8    [8,9]: 2 5
[9,1]: 1 5                  
[9,4]: 1 4    [9,9]: 4 5

對單候選值空位直接做填值處理,即有:

645 327 198
831 954 627
279 618 543
426 895 371
918 473 256
753 260 980
367 502 019
094 700 030
082 139 760

再對剩余空位的候選值做調整處理:

[6,6]: 1 6    [6,9]: 1 4    [7,5]: 4 8
[7,7]: 4 8    [8,1]: 1 5    [8,5]: 6 8
[8,6]: 1 6    [8,7]: 2 8    [8,9]: 2 5
[9,1]: 1 5                  [9,9]: 4 5

可以看到 [8,5] 和 [8,7] 的候選值都只剩下 8,它們同屬第 8 行,前者填入 8 后,會對相關聯的同行、同列、同宮空位做去 8 處理,於是 [8,7] 的候選值集合被收縮為空集,即 [8,7] 位置上無值可填,導致矛盾。

以上花了一些篇幅分析由猜測 [4,2] = 2 引發矛盾的詳細過程。回到 93 步的上下文:

645 327 198
831 954 627
279 618 543

486 095 370
910 073 056
753 200 980

367 502 019
094 700 030
000 039 760

Steps:93
Candidates:
[4,4]: 1    [4,9]: 1 2    [5,3]: 2 [5,4]: 4 8 [5,7]: 2 4 [6,5]: 4 6 [6,6]: 1 6 [6,9]: 1 4 [7,5]: 4 8 [7,7]: 4 8 [8,1]: 1 5 [8,5]: 6 8 [8,6]: 1 6 [8,7]: 2 8 [8,9]: 2 5 [9,1]: 1 5 [9,2]: 2 [9,3]: 2 8 [9,4]: 1 4 [9,9]: 4 5 The foremost cell with 1 candidate(s) at [4,4] At guess level 11 [4,2] 2

這時,已調整為 [4,2] = 8,即處在第 11 級猜測的第二個候選值;此時也有不少空位可以直接填值。繼續看下一步:

Order please:
step
93) shrinking 5 from [8,1] went wrong
94) Upward guess [2,6] level 10 at 2 out of 2
...
The foremost cell with 1 candidate(s) at [2,7]

At guess level 10 [2,6] 2

Order please:

頭兩行輸出信息為:

93) shrinking 5 from [8,1] went wrong
94) Upward guess [2,6] level 10 at 2 out of 2

由第一行的信息可知又出現了矛盾,這里不再詳細分析導致矛盾的具體過程。這次出現矛盾說明 [4,2] 上也不能填 8,即 2 和 8 兩個候選值都不能填,這就說明之前的猜測鏈條上至少有一個環節有問題。因此要調整上級的猜測,這里是第 10 級做出調整,[2,6] 位置上的填值由第一個候選值調整為第二個候選值。

但是如果要仔細分析猜測級別的調整過程,這里給出的上下文信息是不夠的。比如此時知道處在第 10 級猜測,但並不知道前面 9 級猜測是哪些位置上哪些取值,是可以在前面的輸出信息里找到,但是很零散。因此,2.6 版新增了一個 levels 命令來提供這個額外的上下文信息。具體看一下:

Order please: levels
At guess level 10:
Level 10 [2,6]=6 (2 out of 2)
Level 9 [1,7]=1 (1 out of 2)
Level 8 [1,5]=2 (1 out of 2)
Level 7 [1,8]=9 (2 out of 2)
Level 6 [1,2]=4 (2 out of 2)
Level 5 [1,1]=6 (2 out of 2)
Level 4 [3,3]=9 (2 out of 2)
Level 3 [2,3]=1 (1 out of 2)
Level 2 [4,3]=6 (1 out of 2)
Level 1 [6,2]=5 (1 out of 2)

Order please:

這個命令提供了當前各級猜測的信息,比如第 4 級猜測位置在 [3,3],猜測值為 9,是兩個候選值中的第二個。

接下來的兩步:

Order please:
step
...
The foremost cell with 1 candidate(s) at [4,9]

At guess level 10 [2,6] 2

Order please:
step
95) shrinking 5 from [9,9] went wrong
96) Upward guess [1,7] level 9 at 2 out of 2
...
The foremost cell with 1 candidate(s) at [1,9]

At guess level 9 [1,7] 2

Order please:

第 10 級猜測的第二個候選值出現矛盾,向上級調整,第 9 級猜測位置 [1,7] 調整為取第二個候選值。

下一步以及 levels 信息:

Order please:
step
96) shrinking 4 from blk[6,9] went wrong
97) Upward guess [1,5] level 8 at 2 out of 2
...
The foremost cell with 1 candidate(s) at [1,7]

At guess level 8 [1,5] 2

Order please: levels
At guess level 8:
Level 8 [1,5]=8 (2 out of 2)
Level 7 [1,8]=9 (2 out of 2)
Level 6 [1,2]=4 (2 out of 2)
Level 5 [1,1]=6 (2 out of 2)
Level 4 [3,3]=9 (2 out of 2)
Level 3 [2,3]=1 (1 out of 2)
Level 2 [4,3]=6 (1 out of 2)
Level 1 [6,2]=5 (1 out of 2)

第 9 級猜測的第二個候選值出現矛盾,向上級調整,第 8 級猜測位置 [1,5] 調整為取第二個候選值。

從 levels 輸出的信息可以看出 4、5、6、7、8 級猜測取值都在各自的最后一個候選值上。

再下一步以及 levels 信息:

Order please:
step
97) shrinking 7 from [2,9] went wrong
98) Upward guess [2,3] level 3 at 2 out of 2
005 300 000
809 050 020
070 010 500

406 005 300
010 073 056
753 200 080

067 500 009
004 000 030
000 009 700

Steps:98
Candidates:
[1,1]: 1 2 6    [1,2]: 2 4    [1,5]: 2 4 6 8 9
[1,6]: 2 4 6 7 8    [1,7]: 1 4 6 8 9    [1,8]: 1 4 6 7 9
[1,9]: 1 4 7 8    [2,2]: 3 4    [2,4]: 4 6 7
[2,6]: 4 6 7    [2,7]: 1 4 6    [2,9]: 1 3 4 7
[3,1]: 2 3 6    [3,3]: 2    [3,4]: 4 6 8 9
[3,6]: 2 4 6 8    [3,8]: 4 6 9    [3,9]: 3 4 8
[4,2]: 2 8 9    [4,4]: 1 8 9    [4,5]: 8 9
[4,8]: 1 7 9    [4,9]: 1 2 7    [5,1]: 2 9
[5,3]: 2 8    [5,4]: 4 8 9    [5,7]: 2 4 9
[6,5]: 4 6 9    [6,6]: 1 4 6    [6,7]: 1 4 9
[6,9]: 1 4    [7,1]: 1 2 3    [7,5]: 2 3 4 8
[7,6]: 1 2 4 8    [7,7]: 1 2 4 8    [7,8]: 1 4
[8,1]: 1 2 5 9    [8,2]: 2 8 9    [8,4]: 1 6 7 8
[8,5]: 2 6 8    [8,6]: 1 2 6 7 8    [8,7]: 1 2 6 8
[8,9]: 1 2 5 8    [9,1]: 1 2 3 5    [9,2]: 2 3 8
[9,3]: 1 2 8    [9,4]: 1 4 6 8    [9,5]: 2 3 4 6 8
[9,8]: 1 4 6    [9,9]: 1 2 4 5 8
The foremost cell with 1 candidate(s) at [3,3]

At guess level 3 [2,3] 2

Order please: levels
At guess level 3:
Level 3 [2,3]=9 (2 out of 2)
Level 2 [4,3]=6 (1 out of 2)
Level 1 [6,2]=5 (1 out of 2)

第 8 級猜測的第二個候選值出現矛盾,向上級調整,第 7 級猜測位置已經是其最后一個候選值,只能再往上級調整,一直調整到第 3 級猜測位置取其第二個候選值為止。

交互式猜測功能

從最初的 1.0 版到 2.5 版,每一級猜測都是程序按照預設的規則自動進行的,預設的規則也很簡單:

(1)優先對候選值個數少的位置做猜測;

(2)候選值個數少的位置有多處,則選位置最靠前的位置做猜測;

(3)同一個猜測位置的不同候選值按順序遍歷調整。

2.6 版引入的交互式猜測功能打破了規則(1)和規則(2),可以人為干預故意猜對或猜錯,也可以故意挑候選值多的位置做猜測。這樣方便考察一些極端情形下求解的最大猜測級別。

以下采用每次都猜對的做法來看一下求解過程中的最大猜測級別是什么情況。

進入交互式猜測模式:

H:\Read\num\Release>sudoku.exe

Order please: load-quiz h:\s.txt
Quiz loaded.

Order please:
guess-mode
In interactive guessing mode:0 (0:no; other:yes)

Order please: guess-mode 1
In interactive guessing mode:1 (0:no; other:yes)

Order please:

用 step 命令逐步進行求解,碰到需要新猜測的情形程序會停下來:

...
Candidates:
[1,1]: 1 2 6 9    [1,2]: 2 4 9    [1,5]: 2 4 6 8 9
[1,6]: 2 4 6 7 8    [1,7]: 1 4 6 8 9    [1,8]: 1 4 6 7 9
[1,9]: 1 4 7 8    [2,2]: 3 4 9    [2,3]: 1 6 9
[2,4]: 4 6 7 9    [2,6]: 4 6 7    [2,7]: 1 4 6 9
[2,9]: 1 3 4 7    [3,1]: 2 3 6 9    [3,3]: 2 6 9
[3,4]: 4 6 8 9    [3,6]: 2 4 6 8    [3,8]: 4 6 9
[3,9]: 3 4 8    [4,2]: 2 8 9    [4,3]: 2 6 7 8 9
[4,4]: 1 6 8 9    [4,5]: 6 8 9    [4,8]: 1 7 9
[4,9]: 1 2 7    [5,1]: 2 5 9    [5,3]: 2 8 9
[5,4]: 4 8 9    [5,7]: 2 4 9    [5,8]: 4 5 9
[6,1]: 5 6 7 9    [6,2]: 5 9    [6,5]: 4 6 9
[6,6]: 1 4 6    [6,7]: 1 4 9    [6,9]: 1 4 5 7
[7,1]: 1 2 3 7    [7,3]: 1 2 7 8    [7,5]: 2 3 4 8
[7,6]: 1 2 4 7 8    [7,7]: 1 2 4 8    [7,8]: 1 4
[8,1]: 1 2 5 7 9    [8,2]: 2 5 8 9    [8,4]: 1 6 7 8
[8,5]: 2 6 8    [8,6]: 1 2 6 7 8    [8,7]: 1 2 6 8
[8,9]: 1 2 5 8    [9,1]: 1 2 3 5    [9,2]: 2 3 5 8
[9,3]: 1 2 8    [9,4]: 1 4 6 8    [9,5]: 2 3 4 6 8
[9,8]: 1 4 5 6    [9,9]: 1 2 4 5 8
The foremost cell with 2 candidate(s) at [6,2]

Order please: step
2GW: 2 shrunken out of [4,3]
2GW: 8 shrunken out of [4,3]
2GW: 9 shrunken out of [4,3]
2GW: 5 shrunken out of [6,1]
2GW: 9 shrunken out of [6,1]
CelSet: [4,3] [6,1] ValSet: 6 7
6) blk 4 incomplete shrunken by group
Take a guess please, by default it will be [6,2]=5:

這個題已經知道唯一求解,即:

145 327 698
839 654 127
672 918 543
496 185 372
218 473 956
753 296 481
367 542 819
984 761 235
521 839 764

的確有 [6,2]=5,於是直接回車,再用 step 逐步求解:

Steps:9
Candidates:
[1,1]: 1 2 6 9    [1,2]: 2 4 9    [1,5]: 2 4 6 8 9
[1,6]: 2 4 6 7 8    [1,7]: 1 4 6 8 9    [1,8]: 1 4 6 7 9
[1,9]: 1 4 7 8    [2,2]: 3 4 9    [2,3]: 1 6 9
[2,4]: 4 6 7 9    [2,6]: 4 6 7    [2,7]: 1 4 6 9
[2,9]: 1 3 4 7    [3,1]: 2 3 6 9    [3,3]: 2 6 9
[3,4]: 4 6 8 9    [3,6]: 2 4 6 8    [3,8]: 4 6 9
[3,9]: 3 4 8    [4,2]: 2 8 9    [4,3]: 6 7
[4,4]: 1 6 8 9    [4,5]: 6 8 9    [4,8]: 1 7 9
[4,9]: 1 2 7    [5,1]: 2 9    [5,3]: 2 8 9
[5,4]: 4 8 9    [5,7]: 2 4 9    [6,1]: 6 7
[6,5]: 4 6 9    [6,6]: 1 4 6    [6,7]: 1 4 9
[6,9]: 1 4 7    [7,1]: 1 2 3 7    [7,3]: 1 2 7 8
[7,5]: 2 3 4 8    [7,6]: 1 2 4 7 8    [7,7]: 1 2 4 8
[7,8]: 1 4    [8,1]: 1 2 5 7 9    [8,2]: 2 8 9
[8,4]: 1 6 7 8    [8,5]: 2 6 8    [8,6]: 1 2 6 7 8
[8,7]: 1 2 6 8    [8,9]: 1 2 5 8    [9,1]: 1 2 3 5
[9,2]: 2 3 8    [9,3]: 1 2 8    [9,4]: 1 4 6 8
[9,5]: 2 3 4 6 8    [9,8]: 1 4 6    [9,9]: 1 2 4 5 8
The foremost cell with 2 candidate(s) at [4,3]

At guess level 1 [6,2] 1

Order please: step
Take a guess please, by default it will be [4,3]=6:

對照答案,的確有 [4,3]=6,回車,繼續 step:

Steps:14
Candidates:
[1,1]: 1 2 6 9    [1,2]: 2 4 9    [1,5]: 2 4 6 8 9
[1,6]: 2 4 6 7 8    [1,7]: 1 4 6 8 9    [1,8]: 1 4 6 7 9
[1,9]: 1 4 7 8    [2,2]: 3 4 9    [2,3]: 1 9
[2,4]: 4 6 7 9    [2,6]: 4 6 7    [2,7]: 1 4 6 9
[2,9]: 1 3 4 7    [3,1]: 2 3 6 9    [3,3]: 2 9
[3,4]: 4 6 8 9    [3,6]: 2 4 6 8    [3,8]: 4 6 9
[3,9]: 3 4 8    [4,2]: 2 8 9    [4,4]: 1 8 9
[4,5]: 8 9    [4,8]: 1 7 9    [4,9]: 1 2 7
[5,1]: 2 9    [5,3]: 2 8 9    [5,4]: 4 8 9
[5,7]: 2 4 9    [6,5]: 4 6 9    [6,6]: 1 4 6
[6,7]: 1 4 9    [6,9]: 1 4    [7,1]: 1 2 3
[7,5]: 2 3 4 8    [7,6]: 1 2 4 8    [7,7]: 1 2 4 8
[7,8]: 1 4    [8,1]: 1 2 5 9    [8,2]: 2 8 9
[8,4]: 1 6 7 8    [8,5]: 2 6 8    [8,6]: 1 2 6 7 8
[8,7]: 1 2 6 8    [8,9]: 1 2 5 8    [9,1]: 1 2 3 5
[9,2]: 2 3 8    [9,3]: 1 2 8    [9,4]: 1 4 6 8
[9,5]: 2 3 4 6 8    [9,8]: 1 4 6    [9,9]: 1 2 4 5 8
The foremost cell with 2 candidate(s) at [2,3]

At guess level 2 [4,3] 1

Order please: step
Take a guess please, by default it will be [2,3]=1:

輸出正確答案 [2,3]=9,繼續 step:

Take a guess please, by default it will be [2,3]=1:
[2,3]=9
16) Guess [2,3] level 3 at 1 out of 2
...
Steps:21
Candidates:
[1,5]: 2 6 8 9    [1,6]: 2 6 7 8    [1,7]: 6 8 9
[1,8]: 6 7 9    [1,9]: 7 8    [2,4]: 4 6 7
[2,6]: 4 6 7    [2,7]: 1 4 6    [2,9]: 1 4 7
[3,4]: 4 8 9    [3,6]: 4 8    [3,8]: 4 9
[4,2]: 2 9    [4,4]: 1 8 9    [4,5]: 8 9
[4,8]: 1 7 9    [4,9]: 1 2 7    [5,1]: 2 9
[5,4]: 4 9    [5,7]: 2 4 9    [6,5]: 4 6 9
[6,6]: 1 4 6    [6,7]: 1 4 9    [6,9]: 1 4
[7,1]: 2 3    [7,5]: 2 3 4 8    [7,6]: 1 2 4 8
[7,7]: 1 2 4 8    [7,8]: 1 4    [8,1]: 2 5 9
[8,2]: 2 8 9    [8,4]: 1 6 7 8    [8,5]: 2 6 8
[8,6]: 1 2 6 7 8    [8,7]: 1 2 6 8    [8,9]: 1 2 5 8
[9,1]: 2 3 5    [9,2]: 2 8    [9,4]: 4 6 8
[9,5]: 2 3 4 6 8    [9,8]: 4 6    [9,9]: 2 4 5 8
The foremost cell with 2 candidate(s) at [1,9]

At guess level 3 [2,3] 1

Order please: step
Take a guess please, by default it will be [1,9]=7:

這次故意選個候選值多的猜:[1,6]: 2 6 7 8

按答案輸入 [1,6]=7,繼續 step:

Take a guess please, by default it will be [1,9]=7:
[1,6]=7
23) Guess [1,6] level 4 at 1 out of 4
...

Steps:39
Candidates:
[1,7]: 6    [2,4]: 6    [2,6]: 4
[3,4]: 9    [3,6]: 8
The foremost cell with 1 candidate(s) at [1,7]

At guess level 4 [1,6] 1

Order please:
step
145 327 698
839 654 127
672 918 543

496 185 372
218 473 956
753 296 481

367 542 819
984 761 235
521 839 764

Fine [steps:40, solution sum:1].

Order please: levels
At guess level 4:
Level 4 [1,6]=7 (1 out of 4)
Level 3 [2,3]=9 (1 out of 2)
Level 2 [4,3]=6 (1 out of 2)
Level 1 [6,2]=5 (1 out of 2)

Order please:

求得一個解,使用步數為 40,最大猜測級別僅為 4 級。

關閉交互式猜測模式,並給一次 run 命令:

Order please: guess-mode 0
In interactive guessing mode:0 (0:no; other:yes)

Order please: run
...
285) Upward guess [2,3] level 3 at 2 out of 2
289) row 5 complete shrunken by group
291) col 7 complete shrunken by group
292) shrinking 6 from [2,4] went wrong
293) No more solution (solution sum is 1).
145 300 900
839 050 127
672 018 543

426 005 371
518 473 296
793 261 485

067 500 819
954 000 632
081 609 750

Invalid quiz [steps:293] - no more solution (solution sum is 1)
Run time: 234 milliseconds; steps: 293, solution sum: 1.
 Biggest level on this run(til): 11

Order please:

可以看到在求出一個解后到全部走完的過程,最大猜測級別是 11 級。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM