题解 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!!!