先放个题目:
再放个链接 :P2670 [NOIP2015 普及组] 扫雷游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2670
然后是我的代码:
#include<iostream>
#include<cstring>
using namespace std;
char list[110][110];
int result[110][110];
int main()
{
memset(list,'0',sizeof(list));
int n,m,sum=0;
cin>>n>>m;
for(int i=1;i<=n;++i) //输入雷区
for(int j=1;j<=m;++j)
cin>>list[i][j];
for(int i=1;i<=n;++i){ //判断结果并储存在result数组里
for(int j=1;j<=m;++j){
sum=0; //重置地雷数
if(list[i][j]=='*') //如果是地雷直接记录地雷
result[i][j]='*';
else{ //否则寻找周围的地雷数
if(list[i-1][j]=='*')
sum++;
if(list[i+1][j]=='*')
sum++;
if(list[i][j+1]=='*')
sum++;
if(list[i][j-1]=='*')
sum++;
if(list[i-1][j-1]=='*')
sum++;
if(list[i+1][j+1]=='*')
sum++;
if(list[i+1][j-1]=='*')
sum++;
if(list[i-1][j+1]=='*')
sum++;
result[i][j]=sum;
}
}
}
for(int i=1;i<=n;++i){ //输出结果
for(int j=1;j<=m;++j){
if(result[i][j]==42) //如果result中存的是*的ASCII码42,就输出*
cout<<(char)result[i][j];
else
cout<<result[i][j];
}
cout<<endl;
}
return 0;
}
总结下这题:就我的暴力解法没啥思维难点;唯一值得注意的点是在二维数组读入的时候,要注意从下标1处写入数据,否则在边角的点会在寻找地雷时出现数组越界。这样的做法也巧妙解决了边和角要特别拿出来的情况,减少了代码的逻辑复杂度。
by————2023.11.05刷题记录