用于将块放置在给定区域中的动态编程算法

时间:2017-05-05 19:19:46

标签: python algorithm dynamic-programming

你基本上有一个尺寸为4×n的区域。找到可以使用每个尺寸为1×2的块填充此区域的不同方式的数量。您可以旋转较小的块。

我的代码如下。它基本上是一个很大的递归函数。迭代矩阵(4 x n)然后将一个块(如果可能)放到右边(水平)并放置一个块向下(垂直)。每个矩阵[i] [j]将递归地运行,试图确定将块与剩余区域放置的可能的不同方式,等等。我算法的时间复杂度是多少?为O(n ^ 2)?

我的算法速度不够快。想知道是否有人可以提供不同的方法来解决问题。可能使用动态编程,以最小化重复计算。

这些是我迄今为止取得的一些答案。他们肯定是对的,但是'n'可以达到21,这将花费我的计划一段时间。

数目:

4x1: 1
4x2: 5
4x3: 11
4x4: 36
4x5: 95
4x6: 281
4x7: 781
4x8: 2245
4x9: 6336
4x10: 18061
4x11: 51205
4x12: 145601
4x13: 413351
4x14: 1174500
4x15: 3335651

代码:

def Blocks(n):
    maximum = 4*n

    def answerAcquired(counter,result):
        if counter == maximum:                        
            result[0] += 1
            return True
        return False

    def movePointer(matrix,r,c):
        if c + 1 < n:
            if matrix[r][c+1] == False:
                return False, r, c + 1               ## MOVE POINTER RIGHT
            else:
                return movePointer(matrix,r,c+1)
        elif r + 1 < 4:
            if matrix[r+1][0] == False:
                return False, r + 1, 0               ## MOVE POINTER DOWN
            else:
                return movePointer(matrix, r+1,0)   
        else:
             return True, r, c                       ## END OF MATRIX

    def recur(matrix,r,c, counter,result):

        if answerAcquired(counter,result):
            print("----------------------")
            for row in matrix:
                print(row)
            return
        end, r, c = movePointer(matrix, r,c)
        if end: return

        if c+1 < n and matrix[r][c+1] == False:         ## PLACE RIGHT
            matrix2 = [[c for c in r] for r in matrix]
            matrix2[r][c] = 'R'
            matrix2[r][c+1] = "R"
            recur(matrix2, r, c, counter+2, result)

        if r+1 < 4 and matrix[r+1][c] == False:         ## PLACE DOWN
            matrix2 = [ [c for c in r] for r in matrix ]
            matrix2[r + 1][c] = "D"
            matrix2[r][c] = "D"
            recur(matrix2, r, c, counter+2, result)

    r,c,counter, result = 0,-1, 0, [0]
    matrix = [ [ False for y in range(n) ] for x in range(4)]
    recur(matrix,r,c,counter,result)
    return result[0]

print("Answer:",Blocks(5))

0 个答案:

没有答案