你基本上有一个尺寸为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))