初学者专用题解 2.0(正式版)
2026-02-04 15:29:00
发布于:安徽
20阅读
0回复
0点赞
A22.[NOIP2015 普及组] 扫雷游戏 题目描述
现在给出 n 行 m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
输入格式
第一行是用一个空格隔开的两个整数 n 和 m,分别表示雷区的行数和列数。
接下来 n 行,每行 m 个字符,描述了雷区中的地雷分布情况。字符 * 表示相应格子是地雷格,字符 ? 表示相应格子是非地雷格。相邻字符之间无分隔符。
输出格式
输出文件包含 n 行,每行 m 个字符,描述整个雷区。用 * 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
示例代码
#include<bits/stdc++.h>//万能头文件,省事。
using namespace std;
int main() {
int n,m;
cin>>n>>m;
char x[n+2][m+2];//多的留着做缓冲层。
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>x[i][j];
x[0][j]=' ';
x[n+1][j]=' ';
}
x[i][0]=' ';
x[i][m+1]=' ';//11~12 14~15 用“ ”做缓冲层。
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int c=0;//别忘了初始化。
if(x[i][j]=='*') cout<<'*';
else{
if(x[i+1][j]=='*')c++;
if(x[i-1][j]=='*')c++;
if(x[i][j-1]=='*')c++;
if(x[i][j+1]=='*')c++;
if(x[i+1][j+1]=='*')c++;
if(x[i+1][j-1]=='*')c++;
if(x[i-1][j+1]=='*')c++;
if(x[i-1][j-1]=='*')c++;// 22~29 判断。
cout<<c;//输出别忘了。
}
}
cout<<endl;//换行也别忘了。
}
return 0;
}
这里空空如也






有帮助,赞一个