作业有感。保存一下。
采用分治法,先考虑规模为2x2的。此时无论特殊方格在哪里都有对应的L型骨牌填充。扩展到4x4的时候,可以根据特殊方格所在的2x2子矩阵考虑。比如子矩阵在左上角则在子矩阵外放置4号骨牌。这时其他三个矩阵可以被视为有一个格子被特殊方格占据了。代码如下:
"""
设,特殊方格标识为1,四种L型骨牌颜色标识分别为:
3: 0 4: 0 0 5: 0 0 6: 0
0 0 0 0 0 0
"""
import numpy as np
import matplotlib.pyplot as plt
def matrix_fullfill(list:np.ndarray): #将矩阵划分到2x2的大小进行填充。
if np.count_nonzero(list)==1:
if list[0][0]!=0:
list[0][1]=list[1][0]=list[1][1]=6
elif list[0][1]!=0:
list[0][0]=list[1][0]=list[1][1]=3
elif list[1][0]!=0:
list[0][1]=list[0][0]=list[1][1]=5
elif list[1][1]!=0:
list[0][1]=list[0][0]=list[1][0]=4
return list
#4个矩阵的位置分别是 1 2
# 3 4
def matrix_divide_coloerd(matrix):
if len(matrix)>2: #将大矩阵分割为4个小一阶的矩阵
while (matrix == 0).any():
count = int(len(matrix) / 2)
matrix1 = np.zeros((count, count))
matrix2 = np.zeros((count, count))
matrix3 = np.zeros((count, count))
matrix4 = np.zeros((count, count))
for i in range(count):
for x in range(count):
matrix1[i][x]=matrix[i][x]
matrix2[i][x]=matrix[i][x+count]
matrix3[i][x]=matrix[i+count][x]
matrix4[i][x]=matrix[i+count][x+count]
if matrix1.any() !=0 and not matrix1.all() != 0 :
matrix_divide_coloerd(matrix1)
if matrix2[len(matrix2)-1][0]==matrix3[0][len(matrix3)-1]==matrix4[0][0]==0:
matrix2[len(matrix2)-1][0]=6
matrix3[0][len(matrix3)-1]=6
matrix4[0][0]=6
if matrix2.any()!=0 and not matrix2.all() !=0:
matrix_divide_coloerd(matrix2)
if matrix1[count-1][count-1]== matrix3[0][count-1]== matrix4[0][0]==0:
matrix1[count-1][count-1]=3
matrix3[0][count-1]=3
matrix4[0][0]=3
if matrix3.any() !=0 and not matrix3.all() !=0:
matrix_divide_coloerd(matrix3)
if matrix1[len(matrix1)-1][len(matrix1)-1]== matrix2[len(matrix2)-1][0]== matrix4[0][0]==0:
matrix1[len(matrix1)-1][len(matrix1)-1]=5
matrix2[len(matrix2)-1][0]=5
matrix4[0][0]=5
if matrix4.any() !=0 and not matrix4.all() !=0:
matrix_divide_coloerd(matrix4)
if matrix1[len(matrix1) - 1][len(matrix1) - 1] == matrix2[len(matrix2) - 1][0] == matrix3[0][len(matrix3)-1] ==0:
matrix1[len(matrix1) - 1][len(matrix1) - 1] =4
matrix2[len(matrix2) - 1][0] = 4
matrix3[0][len(matrix3)-1] = 4
for i in range(count):
for x in range(count):
matrix[i][x]=matrix1[i][x]
matrix[i][x+count]=matrix2[i][x]
matrix[i+count][x]=matrix3[i][x]
matrix[i+count][x+count]=matrix4[i][x]
else:
matrix=matrix_fullfill(matrix)
n = 8
board = np.zeros((n, n))
input1=input("请输入您想让特殊方格出现的位置,坐标以空格分隔。")
input2=input1.split()
target_x=int(input2[0])-1
target_y=int(input2[1])-1
board[target_x][target_y]=1
matrix_divide_coloerd(board)
print(board)
plt.imshow(board,cmap='binary')
plt.show()