python实现棋盘覆盖问题

        作业有感。保存一下。

        采用分治法,先考虑规模为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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值