python - 矩阵函数对整个矩阵进行操作,作为过滤器来确定相邻单元格中的地雷
问题描述
我必须使用 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.]]
解决方案
原因是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))]
推荐阅读
- python - 为什么 timeit.timeit 中执行时间的计算比 time.time 慢?
- telegram-bot - 无法通过 Telgram bot API 的 send_photo 方法发送高分辨率照片
- javascript - Javascript正则表达式删除不在较大字符串中的子字符串
- python - 有没有更聪明的方法在 Python 中合并这两个列表?
- kotlin - Kotlin:如何获取方法参数的类型
- javascript - WebGL 渲染循环性能
- django - Django Rest Framework Serializer - 如何在无效时允许忽略可选字段?
- amazon-web-services - 使用 AWS SSO 时如何撤销用户会话?
- d3.js - Highcharts - 具有 y 轴值的时间序列图表需要与文本标签分组
- android - MotionLayout中touchAnchorSide的作用是什么?