当前位置:   article > 正文

[NOIP2015 普及组] 扫雷游戏 解题思路及代码

[noip2015 普及组] 扫雷游戏

先放个题目:b77e4f6d08df447c993d506620b1bf26.png

再放个链接 :P2670 [NOIP2015 普及组] 扫雷游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2670

然后是我的代码:

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. char list[110][110];
  5. int result[110][110];
  6. int main()
  7. {
  8. memset(list,'0',sizeof(list));
  9. int n,m,sum=0;
  10. cin>>n>>m;
  11. for(int i=1;i<=n;++i) //输入雷区
  12. for(int j=1;j<=m;++j)
  13. cin>>list[i][j];
  14. for(int i=1;i<=n;++i){ //判断结果并储存在result数组里
  15. for(int j=1;j<=m;++j){
  16. sum=0; //重置地雷数
  17. if(list[i][j]=='*') //如果是地雷直接记录地雷
  18. result[i][j]='*';
  19. else{ //否则寻找周围的地雷数
  20. if(list[i-1][j]=='*')
  21. sum++;
  22. if(list[i+1][j]=='*')
  23. sum++;
  24. if(list[i][j+1]=='*')
  25. sum++;
  26. if(list[i][j-1]=='*')
  27. sum++;
  28. if(list[i-1][j-1]=='*')
  29. sum++;
  30. if(list[i+1][j+1]=='*')
  31. sum++;
  32. if(list[i+1][j-1]=='*')
  33. sum++;
  34. if(list[i-1][j+1]=='*')
  35. sum++;
  36. result[i][j]=sum;
  37. }
  38. }
  39. }
  40. for(int i=1;i<=n;++i){ //输出结果
  41. for(int j=1;j<=m;++j){
  42. if(result[i][j]==42) //如果result中存的是*的ASCII码42,就输出*
  43. cout<<(char)result[i][j];
  44. else
  45. cout<<result[i][j];
  46. }
  47. cout<<endl;
  48. }
  49. return 0;
  50. }

总结下这题:就我的暴力解法没啥思维难点;唯一值得注意的点是在二维数组读入的时候,要注意从下标1处写入数据,否则在边角的点会在寻找地雷时出现数组越界。这样的做法也巧妙解决了边和角要特别拿出来的情况,减少了代码的逻辑复杂度。

by————2023.11.05刷题记录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/602931
推荐阅读
相关标签
  

闽ICP备14008679号