蓝桥杯3月刷题集训-A 【枚举&模拟】Day3

蓝桥杯3月刷题集训-A 【枚举&模拟】Day3

文章目录

  • 蓝桥杯3月刷题集训-A 【枚举&模拟】Day3
    • 一、扫雷
    • 二、含2天数

一、扫雷

蓝桥杯3月刷题集训-A 【枚举&模拟】Day3_第1张图片

我们首先读取输入中的方格图,将其保存在一个二维数组 grid 中。然后,遍历方格图中的每一个方格,对于每个空白方格,遍历其周围八个方格,统计其中地雷的数量,输出结果;对于每个有地雷的方格,直接输出 9。在输出时,每一行输出结束后需要换行,以便下一行的输出。

# 读取输入,n 行 m 列的方格图
n, m = map(int, input().split())
grid = []
for i in range(n):
    row = list(map(int, input().split()))
    grid.append(row)

# 遍历方格图中的每一个方格
for i in range(n):
    for j in range(m):
        # 如果这个方格没有地雷,计算周围八个方格中的地雷数量并输出
        if grid[i][j] == 0:
            count = 0
            # 遍历周围八个方格
            for x in range(max(0, i-1), min(n, i+2)):
                for y in range(max(0, j-1), min(m, j+2)):
                    if grid[x][y] == 1:  # 如果这个方格有地雷,则计数器加 1
                        count += 1
            print(count, end=' ')  # 输出周围地雷数量
        # 如果这个方格有地雷,直接输出 9
        else:
            print(9, end=' ')
    print()  # 每行结束后换行输出下一行

下面是我的朋友提供的另一种解题思路:首先定义一个二维列表来表示扫雷的方格图,将每个有地雷的位置标记为9,对于每个没有地雷的位置,遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量,最后输出整个方格图。

具体实现步骤如下:

  1. 读入 n, m 表示方格图的行数和列数。
  2. 定义一个列表 dir,其中包含八个方向的坐标偏移量,用于表示每个位置周围的八个位置。
  3. 定义一个空列表 s 用于存储方格图。
  4. 定义一个二维列表 vis,用于表示某个位置是否被访问过。
  5. 读入方格图,将其存入列表 s 中,并初始化 vis 为全 False。
  6. 遍历整个方格图,对于每个位置,如果它是有地雷的位置,则将其标记为9,否则遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量。
  7. 在遍历过程中,将该位置的 vis 标记为 True,表示已访问。
  8. 输出整个方格图。
n, m = map(int, input().split())
# 定义方向数组,包含 8 个方向,分别为上、左上、左、左下、下、右下、右、右上。数组中每个元素包含两个值,分别表示在行和列方向上的偏移量。
dir = [[-1,0],[-1,-1],[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1]]
# 定义一个空列表 s,用来存放方格图中每个格子的数字。
s = []
# 定义一个二维数组 vis,用来记录某个格子是否已经被访问过。
vis = [[False]*m for _ in range(n)]
# 定义一个函数 in_bound(x, y),用来判断坐标 (x, y) 是否越界。
def in_bound(x, y):
    return x>=0 and y>=0 and x<n and y<m

# 输入方格图,将每一行作为一个列表,添加到 s 列表中。
for i in range(n):
    row = list(map(int, input().split()))
    s.append(row)

for i in range(n):
    for j in range(m):
        tmp = 0
        # 遍历每一个格子,如果该格子是地雷,则将其标记为 9
        if s[i][j] == 1:
            s[i][j] = 9
        # 如果该格子没有地雷,则统计其周围 8 个格子中地雷的个数,将该个数赋值给该格子。
        elif s[i][j] == 0:
            for k in range(8):
                tx = i + dir[k][0]      # 计算出该格子的下一个格子的坐标
                ty = j + dir[k][1]      # 计算出该格子的下一个格子的坐标
                if in_bound(tx, ty) and ((s[tx][ty] == 1 and not vis[tx][ty]) or s[tx][ty] == 9):   # 如果该格子的下一个格子是地雷,且没有被访问过,则将该格子的数字加 1
                    tmp += 1    # 如果该格子的下一个格子是地雷,且已经被访问过,则不做任何操作
            s[i][j] = tmp   # 将该格子的数字赋值给该格子
        vis[i][j] = True    # 将该格子标记为已经被访问过
        if j == m-1:    # 输出每个格子的数字
            print(s[i][j]) 
        else:   
            print(s[i][j], end=' ')     # 如果该格子是一行的最后一个,则输出一个换行符

二、含2天数

蓝桥杯3月刷题集训-A 【枚举&模拟】Day3_第2张图片

count = 0   # 用来记录含有 2 的天数
for year in range(1900, 10000): # 从 1900 年开始,到 10000 年结束
    for month in range(1, 13):  # 从 1 月开始,到 12 月结束
        if month in [1, 3, 5, 7, 8, 10, 12]:    # 1, 3, 5, 7, 8, 10, 12 月份有 31 天
            days = 31
        elif month == 2:    # 2 月份有 28 天,闰年有 29 天
            if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:    # 判断是否是闰年
                days = 29
            else:
                days = 28
        else:
            days = 30
        for day in range(1, days+1):    # 从 1 号开始,到 days 号结束
            if '2' in str(year) or '2' in str(month).zfill(2) or '2' in str(day).zfill(2):  # 判断年、月、日中是否含有 2
                count += 1  # 如果含有 2,count 加 1
print(count)

你可能感兴趣的:(蓝桥杯训练(Python),蓝桥杯,python)