酷代码 AI
菜单

【NOIP2015 基础】扫雷游戏(mine) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。 输入描述 输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。 接下来 n行,每行m 个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。 输出描述 输出文件包含 n 行,每行 m

以下是使用Python语言解决扫雷游戏问题的代码: ```python # 读取输入的行数和列数 n, m = map(int, input().split()) # 初始化雷区 minefield = [] for _ in range(n): row = input() minefield.append(row) # 定义八个方向的偏移量 directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)] # 遍历雷区的每个格子 for i in range(n): for j in range(m): if minefield[i][j] == '*': # 如果是地雷格,直接输出 '*' print('*', end='') else: # 计算非地雷格周围的地雷数量 mine_count = 0 for dx, dy in directions: ni, nj = i + dx, j + dy # 检查相邻格子是否在雷区内且为地雷格 if 0 <= ni < n and 0 <= nj < m and minefield[ni][nj] == '*': mine_count += 1 # 输出非地雷格周围的地雷数量 print(mine_count, end='') # 换行 print() ``` 代码解释: 1. 读取输入:首先读取雷区的行数 `n` 和列数 `m`,然后逐行读取雷区的布局并存储在 `minefield` 列表中。 2. 定义方向偏移量:定义了八个方向的偏移量,用于检查每个格子的周围格子。 3. 遍历雷区:使用双重循环遍历雷区的每个格子。 4. 处理地雷格:如果当前格子是地雷格,直接输出 `*`。 5. 处理非地雷格:对于非地雷格,遍历其八个相邻格子,统计其中地雷格的数量,并输出该数量。 6. 换行:每一行处理完后,换行输出下一行。 复杂度分析: - 时间复杂度:$O(n * m)$,其中 $n$ 是雷区的行数,$m$ 是雷区的列数。 - 空间复杂度:$O(n * m)$,主要用于存储雷区的布局。 [2026-02-02 17:34:02 | AI问答 | 545点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多