题目描述
在一个 n 行 m列的方格图上有一些位置有地雷,另外一些位置为空。
请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。
输入描述
输入的第一行包含两个整数 n, m。
第 2行到第 n+1 行每行包含 m个整数,相邻整数之间用一个空格分隔。如果对应的整数为 0,
表示这一格没有地雷。如果对应的整数为 1,表示这一格有地雷。
其中,1≤n,m≤100 分钟后还是在当天。
输出描述
输出 n行,每行 m 个整数,相邻整数之间用空格分隔。
对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 99。
输入输出样例
示例 1
输入
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
运行限制
最大运行时间:1s
最大运行内存: 128M
思路:
大体思想是开两个数组,一个放输入的样例 一个放vis标记数组, 然后遍历样例,如果碰到雷,就在标记数组把这个位置标为9.然后把这个位置相邻的八个位置+1由于不是雷的位置周围最多有八个雷,所以那些位置标记不会超过8 不会和9冲突
代码演示——python:
n, m = map(int, input().split())
lis = [] # 用来存输入
for i in range(n): # 存进去
lis.append(list(map(int, input().split())))
# 数组:二维数方法
# [[0 for j in range(m)] for i in range(n)]
# [[0] * m for i in range(n)]
vis = [[0] * m for i in range(n)] # 写一个与lis行数和列数都一样的标记数组
dir1 = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)] # 写一个方向数组
for i in range(n): # 遍历整个lis
for j in range(m):
if lis[i][j] == 1: # 如果这个位置是有雷
vis[i][j] = 9 # 就将标记数组标记为9
for x in dir1: # 然后对周围八个位置进行检查遍历
xi = i + x[0]
xj = j + x[1]
if 0 <= xi <= n - 1 and 0 <= xj <= m - 1:
# 筛选八个位置中不出界的位置
if vis[xi][xj] != 9: # 如果这个位置不是9
vis[xi][xj] += 1 # 就将这个位置+1 表示周围有一个雷了
# 位置上的数会不断累加,而且最多不会超过8 因为最多只有周围八个有雷 所以vis标记的9和这个不会冲突
for i in range(n): # 循环遍历输出
for j in range(m):
print(vis[i][j], end=' ')
print()