[NC16491] 扫雷游戏
[NOIP2015]扫雷游戏
https://ac.nowcoder.com/acm/problem/16491
题面
题目跳转入口:[NC16491] 扫雷游戏
题目描述
扫雷游戏是一款十分经典的单机小游戏。在行
列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
输入
输入文件第一行是用一个空格隔开的两个整数和
,分别表示雷区的行数和列数。
接下来
行,每行
个字符,描述了雷区中的地雷分布情况。字符
*
表示相应格子是地雷格,字符?
表示相应格子是非地雷格。相邻字符之间无分隔符。
输出
输出文件包含行,每行
个字符,描述整个雷区。用
*
表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
样例输入
3 3
*??
???
?*?
样例输出
*10
221
1*1
本题其实就是统计二维数组中每个元素是不是*
,如果不是,统计它周围有多少个*
解法
- 本题涉及到了多个方向,所以使用方向数组
- 准备一个
数组统计地雷的个数,如果这个格子本来就是地雷,标记为-1,否则统计地雷的个数
- 如果
为-1,输出
*
,否则输出的值
误区
本题的误区在于需要判断边界,否则会发生段错误
!(i+dx[k]<0 || j+dy[k]<0)
代码
#include<bits/stdc++.h>
using namespace std;
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};//方向数组
int cnt[105][105];//统计数组
string s[105];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)cin>>s[i];//读入
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(s[i][j]=='*')cnt[i][j]=-1;//是雷区
else{
for(int k=0;k<8;k++)//八个方向
if(!(i+dx[k]<0 || j+dy[k]<0))//边界判断
if(s[i+dx[k]][j+dy[k]]=='*')//这个方向是雷
cnt[i][j]++;//雷的数量加一
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(cnt[i][j]==-1)cout<<"*";//是雷
else cout<<cnt[i][j];
}
cout<<endl;//别忘了输出换行
}
return 0;
}
[牛可乐jerry] 题解栏 文章被收录于专栏
收录牛客竞赛oj的题解