Algorithm prolog数独块算法?
如何在prolog中获取块的所有元素?在我的代码中,大小可以动态更改,因此块大小不同,4x4=4个元素,9x9=9个元素等。块被切割成正方形,因此在4x4中,块的水平长度为圆形(sqrt(4))=2,垂直长度为圆形(sqrt(4))=2。和9x9。。。sqrt(9)。。所以块的高度和宽度是3。我需要一个算法来提高元素的效率 我的数独列表是这样建立的: L=[ [4,3,1,2], [2,1,4,3], [3,4,2,1], [1,2,3,4] ], 所以是一个列表,包含数独中的行列表。检查行和列没有问题,->所有不同的行检查,将整个列表转置,所有不同的检查与转置的列表 但由于数独的动态大小,我无法为这些块编写修复代码。有人知道吗?我曾考虑过展平(L)和使用偏移来获得正确的块,但这样做似乎很难Algorithm prolog数独块算法?,algorithm,list,prolog,sudoku,Algorithm,List,Prolog,Sudoku,如何在prolog中获取块的所有元素?在我的代码中,大小可以动态更改,因此块大小不同,4x4=4个元素,9x9=9个元素等。块被切割成正方形,因此在4x4中,块的水平长度为圆形(sqrt(4))=2,垂直长度为圆形(sqrt(4))=2。和9x9。。。sqrt(9)。。所以块的高度和宽度是3。我需要一个算法来提高元素的效率 我的数独列表是这样建立的: L=[ [4,3,1,2], [2,1,4,3], [3,4,2,1], [1,2,3,4] ], 所以是一个列表,包含数独中的行列表。检查行和列
请帮帮我 一个可能的解决方案如下(假设您有
blocksize
xblocksize
块大小blocksize
xblocksize
-在标准数独游戏中,所有数字都相等,可以调整以匹配其他布局)
a=[],…,[]
成为blocksize
存储桶的列表blocksize
部分a
blocksize
xblocksize
块L=[ [4,3,1,2], [2,1,4,3], [3,4,2,1], [1,2,3,4] ]
Partitions => [[4,3] [1,2] [2,1] [4,3] [3,4] [2,1] [1,2] [3,4]]
Bucketed => [[4,3] [2,1] [3,4] [1,2]] [[1,2] [4,3] [2,1] [3,4]]
Flattened => [4,3,2,1,3,4,1,2,1,2,4,3,2,1,3,4]
Partitioned => [4,3,2,1], [3,4,1,2], [1,2,4,3], [2,1,3,4]]
?- transpose([[1,2,3],[4,5,6],[7,8,9]],X).
X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
下面是一些简单的序言,用于在列表表示法中转置矩阵。其思想是通过将头部从每一行中拉出来创建一个新的“第一行”,然后在“剩余”尾部列表上递归 例如:
L=[ [4,3,1,2], [2,1,4,3], [3,4,2,1], [1,2,3,4] ]
Partitions => [[4,3] [1,2] [2,1] [4,3] [3,4] [2,1] [1,2] [3,4]]
Bucketed => [[4,3] [2,1] [3,4] [1,2]] [[1,2] [4,3] [2,1] [3,4]]
Flattened => [4,3,2,1,3,4,1,2,1,2,4,3,2,1,3,4]
Partitioned => [4,3,2,1], [3,4,1,2], [1,2,4,3], [2,1,3,4]]
?- transpose([[1,2,3],[4,5,6],[7,8,9]],X).
X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
但是请注意,对于大小为K²xK²的广义数独矩阵,在每个大小为KxK的“框”中也有“所有不同”的条目平铺矩阵。使用与以前相同的设计,还需要一个谓词将数独矩阵重新打包到一个“框”列表列表中
要做到这一点,只需要进一步的谓词将矩阵“划分”为K行组
part_K_rows([ ],_,[ ]) :- !.
part_K_rows(A,K,[H|T]) :-
get_K_rows(A,K,H,B),
part_K_rows(B,K,T).
get_K_rows(A,0,[ ],A) :- !.
get_K_rows([H|T],K,[H|Z],B),
J is K-1,
get_K_rows(T,J,Z,B).
将部分行/3应用于原始数独矩阵,然后转置产生的每个行分区,并将部分行/3应用于每个行,将生成所需的“框”列表列表。通过“块”,你是指整个普通9x9数独分成的九个3x3段之一吗?