蓝桥杯3月刷题集训-A 【枚举&模拟】Day3
一、扫雷
我们首先读取输入中的方格图,将其保存在一个二维数组 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,对于每个没有地雷的位置,遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量,最后输出整个方格图。
具体实现步骤如下:
- 读入 n, m 表示方格图的行数和列数。
- 定义一个列表 dir,其中包含八个方向的坐标偏移量,用于表示每个位置周围的八个位置。
- 定义一个空列表 s 用于存储方格图。
- 定义一个二维列表 vis,用于表示某个位置是否被访问过。
- 读入方格图,将其存入列表 s 中,并初始化 vis 为全 False。
- 遍历整个方格图,对于每个位置,如果它是有地雷的位置,则将其标记为9,否则遍历其周围的八个位置,计算出周围地雷的数量,将该位置标记为该数量。
- 在遍历过程中,将该位置的 vis 标记为 True,表示已访问。
- 输出整个方格图。
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天数
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)