赞
踩
先放个题目:
再放个链接 :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刷题记录
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。