12.题目:编号549 扫雷

题目:

###本题目主要考察的是模拟

#include<bits/stdc++.h>
using namespace std;
const int N=150;
int a[N][N],b[N][N];
int main(){
  int n,m;
  cin>>n>>m;
  for(int i=1;i<=n;++i){
    for(int j=1;j<=m;++j){
      cin>>a[i][j];
    }
  }

  for(int i=1;i<=n;++i){
    for(int j=1;j<=m;++j){
      //有雷变9,该位置则不扫描,跳过
      if(a[i][j]){
        b[i][j]=9;
        continue;
      }
      //扫描地雷,边界问题用max函数和min函数解决,不需要罗列条件
      for(int _i=max(1,i-1);_i<=min(n,i+1);++_i){
        for(int _j=max(1,j-1);_j<=min(m,j+1);++_j){
          if(a[_i][_j]){
            b[i][j]++;
          }
        }
      }

    }
  }

  for(int i=1;i<=n;++i){
    for(int j=1;j<=m;++j){
      cout<<b[i][j]<<' ';
    }
    cout<<'\n';
  }
  return 0;
}

整体思路:

  1. 首先开两个二维数组a,b,根据题目要求将数据输入
  2. 用双重for循环对a的每行每列进行搜索,如果有雷的话将b的该位置置为9,并且不要扫描直接跳出循环,否则扫描该位置有多少个雷
  3. 扫描需要考虑到特殊情况(边界时),罗列条件的话太过复杂,这里可以直接用max和min函数来解决,将扫描的上下界锁死(比如:边界够大时,我要扫描a[3,3]位置,那么_i=2,判断条件是_i<=4,同理_j=2,判断条件是_j<=4,特殊情况:要考虑边界时,扫描a[1,1]位置时,max就会将边界锁在下标1)
  4. 最后,将b数组输出即可

###括号有点多不要看串了

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值