[NOIP2015 普及组] 扫雷游戏——防止数组越界访问

题目背景

NOIP2015 普及组 T2

题目描述

扫雷游戏是一款十分经典的单机小游戏。在 nm 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出 nm 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入格式

第一行是用一个空格隔开的两个整数 nm,分别表示雷区的行数和列数。

接下来 n 行,每行 m 个字符,描述了雷区中的地雷分布情况。字符 * 表示相应格子是地雷格,字符 ? 表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式

输出文件包含 n 行,每行 m 个字符,描述整个雷区。用 * 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

样例 #1

样例输入 #1

3 3
*??
???
?*?

样例输出 #1

*10
221
1*1

样例 #2

样例输入 #2

2 3
?*?
*??

样例输出 #2

2*1
*21

提示

对于 100%的数据,1n100,1m100

反思总结

我的90分作答

#include <bits/stdc++.h>
using namespace std;
int main() {
int n,m;
cin >> n >> m;
string a[n+10];
int sum=0;
for (int i=1;i<=n;i++) {
cin >> a[i];
a[i] = "0" + a[i] + "0";
}
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
if (a[i][j]=='*') {
cout << '*';
} else {
for (int k=-1;k<=1;k++) {
for (int l=-1;l<=1;l++) {
if (a[i+k][j+l]=='*') {
sum++;
}
}
}
cout << sum;
sum = 0;
}
}
cout << endl;
}
return 0;
}

ChatGPT修改后的100分作答

#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<string> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == '*') {
cout << '*';
} else {
int sum = 0;
// 统计周围八个方向的地雷数量
for (int k = -1; k <= 1; k++) {
for (int l = -1; l <= 1; l++) {
int ni = i + k, nj = j + l;
// 检查边界,确保不越界访问
if (ni >= 0 && ni < n && nj >= 0 && nj < m && a[ni][nj] == '*') {
sum++;
}
}
}
cout << sum;
}
}
cout << endl;
}
return 0;
}

总结

要防止数组越界访问;可以在访问数组时加上if条件,内容为索引变量与0等边界的大小关系。

发布于   xiins  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示