蓝桥杯真题——扫雷

题目描述
在一个 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()

 

运行结果如下:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值