Algorithm prolog数独块算法?

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] ], 所以是一个列表,包含数独中的行列表。检查行和列

如何在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)和使用偏移来获得正确的块,但这样做似乎很难


请帮帮我

一个可能的解决方案如下(假设您有
blocksize
x
blocksize
块大小
blocksize
x
blocksize
-在标准数独游戏中,所有数字都相等,可以调整以匹配其他布局)

  • a=[],…,[]
    成为
    blocksize
    存储桶的列表
  • 将每行划分为
    blocksize
    部分
  • 将第一部分放入第一个铲斗,第二部分放入第二个铲斗,依此类推。如果到达最后一个桶,请再次从第一个桶开始
  • 完全展平
    a
  • 将结果再次划分为
    blocksize
    x
    blocksize
  • 在您的示例中:

    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段之一吗?