使用Perl解决numbrix难题

时间:2015-06-21 09:37:50

标签: perl

任务是解决方形numbrix拼图。 numbrix谜题由字段n*n组成,每个单元格可以包含数字1 -> n*n。任务是解决难题并创建从编号为1的单元格到编号为n*n的单元格的路径。 解决方案示例:

... ... 017 ... ...
... 021 ... 023 ...
005 ... ... ... 013
... 003 ... 001 ...
... ... 009 ... ... 

解决方案:

019 018 017 016 015
020 021 022 023 014
005 004 025 024 013
006 003 002 001 012
007 008 009 010 011

我的老师给了我们一个包含一些步骤的文件(由他的解决方案perl程序打印)。但我无法计算减少列表的步骤。

我老师的程序打印出来:

... ... 017 ... ...
... 021 ... 023 ...
005 ... ... ... 013
... 003 ... 001 ...
... ... 009 ... ...


1 | 2 < 3 | 4 < 5 > 6 | 7 < 8 < 9 > 10 | 11 < 12 < 13 > 14 | 15 < 16 < 17 > 18 | 19 < 20 < 21 | 22 < 23 > 24 > 25

1.1:      15 19 
1.2:      16 18 20
1.4:      16 18 22 24
1.5:      11 15 25 
2.1:      4 6 20
2.3:      16 18 20 22 24
2.5:      12 14 22 24
3.2:      2 4 6 20
3.3:      7 11 15 19 25 
3.4:      12 14 22 24
4.1:      2 4 6
4.3:      2 8 10
4.5:      12 14
5.1:      7
5.2:      2 8 10
5.4:      8 10
5.5:      7 11

1.1:      19
1.2:      18 20
1.4:      16 24
1.5:      15 25
2.1:      20
2.3:      16 18 20 22 24
2.5:      14 24
3.2:      4 6 20
3.3:      7 11 15 19 25
3.4:      12 14 24
4.1:      4 6
4.3:      2 8 10
4.5:      12
5.1:      7
5.2:      8
5.4:      10
5.5:      11

# cell(s) with only one candidate: (1.1=19) (2.1=20) (1.2=18) (4.5=12) (5.1=7) (5.2=8) (5.4=10) (4.3=2) (5.5=11)

019 018 017 ... ...
020 021 ... 023 ...
005 ... ... ... 013
... 003 002 001 012
007 008 009 010 011

1.4:      16 24
1.5:      15 25
2.3:    * 16 22 24
2.5:      14 24
3.2:    * 4
3.3:    * 15 25
3.4:    * 14 24
4.1:      4 6

# cell(s) with only one candidate: (3.2=4) (4.1=6)

019 018 017 ... ...
020 021 ... 023 ...
005 004 ... ... 013
006 003 002 001 012
007 008 009 010 011

1.4:      16 24
1.5:      15 25
2.3:      16 22 24
2.5:      14 24
3.3:      15 25
3.4:      14 24

# cell(s) with only one candidate: (2.3=22)

019 018 017 ... ...
020 021 022 023 ...
005 004 ... ... 013
006 003 002 001 012
007 008 009 010 011

1.4:      16 24
1.5:      15 25
2.5:      14 24
3.3:    * 25
3.4:    * 24

# cell(s) with only one candidate: (3.3=25) (1.5=15) (3.4=24) (1.4=16) (2.5=14)

019 018 017 016 015
020 021 022 023 014
005 004 025 024 013
006 003 002 001 012
007 008 009 010 011

我的解决方案可以做什么:

我有一个跟踪单元格的数据结构(例如1.1),它是候选者。我可以打印出第一个清单。

我的问题是:

我不明白他如何减少每个细胞的候选人数量。例如:第一个列表说单元格1.1的可能候选者是15和19.(我有这整个列表)。但突然间,他可以减少列表,说单元格1.1只能包含数字:19。他是如何做到这一点的? (我不需要任何代码,我不理解这种减少背后的逻辑)。

1 个答案:

答案 0 :(得分:0)

您不是要求代码,只是为了逻辑。所以这可能就是你要找的东西:
为了保留候选人(例如,15或19为1.1) 它需要两个相邻的候选人(例如,15和16为16,或18和20为19) 在两个边界单元格中(例如1.2和2.1。) 这种情况适用于19但不适用于15,因此19次停留但15次被淘汰。