[NC16491] 扫雷游戏

[NOIP2015]扫雷游戏

https://ac.nowcoder.com/acm/problem/16491

题面

题目跳转入口:[NC16491] 扫雷游戏

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

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

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

输入
输入文件第一行是用一个空格隔开的两个整数,分别表示雷区的行数和列数。 接下来行,每行个字符,描述了雷区中的地雷分布情况。字符*表示相应格子是地雷格,字符?表示相应格子是非地雷格。相邻字符之间无分隔符。

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

样例输入

3 3
*??
???
?*?

样例输出

*10
221
1*1

本题其实就是统计二维数组中每个元素是不是*,如果不是,统计它周围有多少个*

解法

  1. 本题涉及到了多个方向,所以使用方向数组
  2. 准备一个数组统计地雷的个数,如果这个格子本来就是地雷,标记为-1,否则统计地雷的个数
  3. 如果为-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的题解

全部评论

相关推荐

05-12 16:04
已编辑
江西财经大学 Java
点赞 评论 收藏
分享
04-08 13:31
已编辑
门头沟学院 前端工程师
D0cC:京东营收1万多亿人民币,阿里9000多亿,虽然他俩利润都没腾讯和字节多,但是很恐怖了啊,负担了多少打工人的薪水
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务