Python:每日一题之扫雷(二维列表切分)

题目描述

在一个 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种情况

9种存在情况
行\列0123
00(1)1(5)0(5)0(3)
11(7)0(9)1(9)0(8)
20(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=' ')

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值