题解 P2670 【扫雷游戏】

· · 题解

lalala~~~

这题数据并不大,最大不过100*100,所以果断穷举

其实本来我是想边读边做的,但读入是个问题。

主要思路呢,就是读完之后穷举一边,只要是炸弹,就把周围一圈8个加一遍

AC代码:

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<cmath>
#include<ctime>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<cstdio>
#include<sstream>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>//忒多的头文件
using namespace std;
int n,m;
int mm[105][105];
char a[105][105];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%s",&a[i]);//我之前想的读入好复杂,,结果。。。
    }
    for(int i=1;i<=n;i++){//穷举
        for(int j=0;j<m;j++){
            if(a[i][j]=='*'){//是炸弹的情况
                mm[i][j]=-100000000;//其实一个点最多就加8下
                mm[i-1][j-1]++;//不停加,8个
                mm[i-1][j]++;
                mm[i-1][j+1]++;
                mm[i][j-1]++;
                mm[i][j+1]++;
                mm[i+1][j-1]++;
                mm[i+1][j]++;
                mm[i+1][j+1]++;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            if(mm[i][j]<0){//是地雷就输出*
                cout<<"*";
            }
            else{
                cout<<mm[i][j];//不是就输出周围个数
            }
        }
        cout<<endl;
    }
    return 0;
}

其实最后输出的时候可以用一句概括为一个三目表达式:cout<<(mm[i][j]<0?'*':m[i][j]); 最后,祝大家AV!!!(划掉)AC!!!