首页 > 解决方案 > 矩阵函数对整个矩阵进行操作,作为过滤器来确定相邻单元格中的地雷

问题描述

我必须使用 python 创建一个扫雷游戏,这是 codesignal INTRO 挑战的一部分

我已经尝试了一个代码,但它不适用于最后一行和最后一列

import numpy as np

matrix = [[True,False,False,True], 
 [False,False,True,False], 
 [True,True,False,True]]

def minesweeper(matrix):
    re=np.zeros((len(matrix),len(matrix[0])))
    for i in range(len(matrix)-1):
        #print(i)
        for j in range(len(matrix[0])-1):
            #print(j)
            if (j==0) and (i==0):

                re[i][j]=matrix[i][j+1]+matrix[i+1][j]+matrix[i+1][j+1]

            elif (j==len(matrix[0])-1)and(i==0):
                re[i][j]=matrix[i][j-1]+matrix[i+1][j]+matrix[i+1][j-1]

            elif (i==len(matrix)-1)and (j==0) :
                re[i][j]=matrix[i-1][j]+matrix[i-1][j+1]+matrix[i][j+1]

            elif (i==len(matrix)-1)and(j==len(matrix[0])-1):
                re[i][j]=matrix[i][j-1]+matrix[i-1][j]+matrix[i-1][j-1]

            elif (i==0 and j!=0) or (i==0 and j!=len(matrix[0])-1):
                re[i][j]=matrix[i][j-1]+matrix[i][j+1]+matrix[i+1][j-1]+matrix[i+1][j]+matrix[i+1][j+1]

            elif (i==(len(matrix)-1) and j!=0) or (i==(len(matrix)-1) and j!=len(matrix[0])-1):
                re[i][j]=matrix[i][j-1]+matrix[i][j+1]+matrix[i+1][j]+matrix[i+1][j-1]+matrix[i+1][j+1]

            elif  (j==0 and i!=0)and (j==0 and i!=len(matrix)-1):
                re[i][j]=matrix[i+1][j]+matrix[i-1][j]+matrix[i+1][j+1]+matrix[i][j+1]+matrix[i-1][j+1]
            elif (j==len(matrix[0])-1 and i!=0) and (j==len(matrix[0])-1 and i!=len(matrix)-1):
                re[i][j]=matrix[i+1][j]+matrix[i-1][j]+matrix[i+1][j+1]+matrix[i][j+1]+matrix[i-1][j+1]

            else:
                re[i][j]=matrix[i-1][j]+matrix[i+1][j]+matrix[i][j-1]+matrix[i][j+1]+matrix[i-1][j-1]+matrix[i+1][j-1]+matrix[i-1][j+1]+matrix[i+1][j+1]
    return re


minesweeper(matrix)


Output should be 
[[0,2,2,1], 
 [3,4,3,3], 
 [1,2,3,1]]

But I am getting 
[[0., 2., 2., 0.],
       [3., 4., 3., 0.],
       [0., 0., 0., 0.]]

标签: python

解决方案


原因是range(len(matrix)-1) range(len(matrix[0])-1)不包括最后一列和最后一行,而且我认为如果你单独处理边界问题,逻辑很复杂,你可以把它们放在一起,访问8个邻居,统一检查边界,像这样:

def minesweeper(matrix):
    re = np.zeros((len(matrix), len(matrix[0])))
    for i in range(len(matrix)):
        for j in range(len(matrix[0])):
            for I, J in (i - 1, j - 1), (i - 1, j), (i - 1, j + 1), (i, j - 1), (i, j + 1), (i + 1, j - 1), (
            i + 1, j), (i + 1, j + 1):
                if 0 <= I < len(matrix) and 0 <= J < len(matrix[0]):
                    re[i][j] += matrix[I][J]

输出:

[[0. 2. 2. 1.]
 [3. 4. 3. 3.]
 [1. 2. 3. 1.]]

我认为 np.zeros 不适合这里,你可以使用 2d-list:

re = [[0] * len(matrix[0]) for _ in range(len(matrix))]

推荐阅读