题目描述
在一个 n 行 m 列的方格图上有一些位置有地雷,另外一些位置为空。
请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。
输入描述
输入的第一行包含两个整数 n,m。
第 2 行到第 n + 1 行每行包含 m 个整数,相邻整数之间用一个空格分隔。如果对应的整数为 0,表示这一格没有地雷。如果对应的整数为 1,表示这一格有地雷。
其中,1 ≤ n,m ≤ 100 分钟后还是在当天。
输出描述
输出 n 行,每行 m 个整数,相邻整数之间用空格分隔。
对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 9。
输入输出样例
输入
3 4
0 1 0 0
1 0 1 0
0 0 1 0
输出
2 9 2 1
9 4 9 2
1 3 9 2
思考:
二维列表切分:先取行( i ),再取列( j )
[lis[i][j:j+2] for i in range(i,i+2)]
这道题类似于图像模糊那道题,9种情况
行\列 | 0 | 1 | 2 | 3 |
0 | 0(1) | 1(5) | 0(5) | 0(3) |
1 | 1(7) | 0(9) | 1(9) | 0(8) |
2 | 0(2) | 0(6) | 1(6) | 0(4) |
不同于那道题,那道题是求平均值,这道题是求和
sum(map(sum,a_lis))
内部第一个sum是对每一行求和,得到每一行的和后,再将其map给第二个sum,即可以得到总的和;
除此之外还有二维数组求最大值、最小值、求平均值
最大值
max(map(max,a_lis))
最小值
min(map(min,a_lis))
平均值:使用平均值时需要导入库:from statistics import mean
mean(map(mean,a_lis))
注意!!! [lis[i][j:j+2] for i in range(i,i+2)],中 j 和 i 都是左闭右开,取值范围要注意
参考代码:
N,M = [int(i) for i in input().split()]
lis = []
for i in range(N):
a_lis = [int(j) for j in input().split()] # 将input的值传入 j
lis.append(a_lis)
def get_sum(i,j): #i,j表示中心坐标
if i == 0 and j == 0: #(1)
a_lis = [lis[i][j:j+2] for i in range(i,i+2)]
elif i == N-1 and j == 0: #(2)
a_lis = [lis[i][j:j+2] for i in range(i-1,i+1)]
elif i == 0 and j == M-1: #(3)
a_lis = [lis[i][j-1:j+1] for i in range(i,i+2)]
elif i == N-1 and j == M-1: #(4)
a_lis = [lis[i][j-1:j+1] for i in range(i-1,i+1)]
elif i == 0: #(5)
a_lis = [lis[i][j-1:j+2] for i in range(i,i+2)]
elif i == N-1: #(6)
a_lis = [lis[i][j-1:j+2] for i in range(i-1,i+1)]
elif j == 0: #(7)
a_lis = [lis[i][j:j+2] for i in range(i-1,i+2)]
elif j == M-1: #(8)
a_lis = [lis[i][j-1:j+1] for i in range(i-1,i+2)]
else: #(9)
a_lis = [lis[i][j-1:j+2] for i in range(i-1,i+2)]
return sum(map(sum,a_lis))
for i in range(N):
for j in range(M):
if lis[i][j]==1:
print(9,end=' ')
else:
print(int(get_sum(i,j)),end=' ')
print('\n',end=' ')