Python蓝桥杯算法习题讲解——枚举算法进阶——扫雷矩阵问题

一、题目描述       

         在一个n行m列的方格图中有一些位置有地雷,另外一些位置为空,请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。

二、输入描述

        输入第1行包含两个整数n,m

        第2行到第n + 1行每行包含m个整数,相邻整数之间用一个空格分隔,,如果对应的整数为0,表示这一格没有地雷,如果对应的整数为1,表示这一格有地雷。

        其中,1\leqslantn,m\leqslant100分钟后还是在当前

三、输出描述

        输出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

五、解题代码与思路

import os
import sys

'''定义一个读入列表的函数'''
def input_list():
    return list(map(int,input(),split()))

n,m = input_list() # 输入n和m
a = [] # 建立一个空列表a方便后续储存
for i in range(n): 
    a.append(input_list()) # 存储到a列表中

''' n行m列的数组 for i in range(n)为n行 [0] * m为m列】 '''
b = [[0] * m for i in range(n)]

''' 以上为准备工作 '''


'''
此处讲解如何创建坐标点

定义一个初始点(x + 0,y + 0),那么它的周围有8个方向 上下左右4个 以及 左上,右上,左下,右下4个方向

形式如下 上+ 下-

(x + 1,y - 1),(x + 1,y + 0),(x + 1,y + 1) | (1,-1)  (1,0)  (1,1)
(x + 0,y - 1),(x + 0,y + 0),(x + 0,y + 1) | (0,-1)  (0,0)  (0,1)
(x - 1,y - 1),(x - 1,y + 0),(x - 1,y + 1) | (-1,-1) (-1,0) (-1,1)

那么我们就会得到这样的一个九格坐标,以(x + 0,y + 0)为中心点
那么我们就可以用一个列表来储存我们的坐标点

'''
dir = [(1,0),(0,1),(-1,0),(0,-1),(-1,-1),(-1,1),(1,-1),(1,1)] #在原点(0,0)周围的8个坐标点
'''
这个列表存储了一个坐标点周围 8 个相邻位置的偏移量。例如,(1, 0) 表示在当前坐标点的正下方,(0, 1) 表示在当前坐标点的正右方。
'''

'''枚举第i行 枚举第j列 '''
for i in range(n):
    for j in range(m):
        if a[i][j] == 1: # for 循环遍历数组 a 的每个元素,其中 i 表示行索引,j 表示列索引。
            b[i][j] = 9    # 如果 a[i][j] 的值为 1,则将数组 b 中对应位置 b[i][j] 的值设为 9。
        else:
            b[i][j] = 0    # 否则,将 b[i][j] 初始化为 0,然后通过内层的 for 循环遍历 dir 列表中的 8 个偏移量,计算当前坐标点 (i, j) 周围 8 个相邻位置的坐标 (x, y)。
            for k in range(8):
                x,y = i + dir[k][0],j+dir[k][1]
                if 0 <= x < n and 0 <= y < m:
                    b[i][j] += a[x][y]
                    '''对于每个相邻位置,检查其坐标是否在数组 a 的有效范围内(即 0 <= x < n 且 0 <= y < m),如果在有效范围内,则将该位置在数组 a 中的元素值累加到 b[i][j] 中。'''
        print(b[i][j],end='')
print()



你可能感兴趣的:(算法,python自学,python,算法,开发语言,矩阵)