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

题目背景

NOIP2015 普及组 T2

题目描述

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

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

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

输入格式

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

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

输出格式

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

样例 #1

样例输入 #1

3 3
*??
???
?*?

样例输出 #1

*10
221
1*1

样例 #2

样例输入 #2

2 3
?*?
*??

样例输出 #2

2*1
*21

提示

对于 \(100\%\)的数据,\(1≤n≤100, 1≤m≤100\)

反思总结

我的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等边界的大小关系。

posted @ 2024-10-31 22:08  ToFuture$  阅读(95)  评论(0)    收藏  举报