ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

用C++实现的数独解题程序 SudokuSolver 2.6 的新功能及相关分析

2021-10-30 21:36:34  阅读:191  来源: 互联网

标签:guess 猜测 level please C++ Order SudokuSolver 2.6 out


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 级。

 

标签:guess,猜测,level,please,C++,Order,SudokuSolver,2.6,out
来源: https://www.cnblogs.com/readalps/p/15484784.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有