上海交大OJ1003二哥养细菌

本文介绍了一种通过填充法更新矩阵中特定元素的算法。该方法通过对矩阵边缘进行特殊填充来简化条件判断,并通过遍历矩阵查找并更新指定元素,避免了复杂的边界条件判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


问题概述

在这里插入图片描述
在这里插入图片描述


算法分析

思路很简单,就是一次一次的遍历整个矩阵,遇到0时需要查看上下左右是否有1,如果有,就把0改为1,直到矩阵中不在含有0元素即可。但是有几个细节需要注意。第一点就是可以知道培养皿边缘的格子是特殊的格子,有可能没有上/下/左/右相邻的格子,所以可能需要很多if条件语句来进行判断。第二个方面就是判断是否存在0元素最好有一个标识,在查询0是否存在并且更改0元素的过程后就可以判断。而不需要修改完成后的矩阵再进行遍历,这样会简化工作量。最后,最重要的一点,就是千万不要忘记遍历过程中不能立即修改0元素,否则会影响这一次遍历中其他元素的变化情况。

简化条件判断

针对第一方面采用特殊的填充法。即在L*L矩阵周围填充一圈,形成L+2长,L+2宽的矩阵。并且填充数字为4。这样遍历时从1到L即可,同时免去边界判断。

代码

代码如下(示例):

#include<iostream>
using namespace std;

int main(){

    int L,k,n;
    cin>>L;
    int t=1;
    k=0;
    n=0;
    int p[L+2][L+2];
    for(int i=0;i<L+2;i++)
    for(int j=0;j<L+2;j++)
        p[i][j]=4;
    for(int i=1;i<=L;i++){
    for(int j=1;j<=L;j++){
      cin>>p[i][j];
      if(p[i][j]==0) t=0;
    }
    }
   
    while(!t){
    for(int i=1;i<=L;i++){
    for(int j=1;j<=L;j++){
            
            if(p[i][j]==0){
                if(p[i][j-1]==1||p[i][j+1]==1||p[i-1][j]==1||p[i+1][j]==1)
               { p[i][j]=3; n++;}
                
            }
            else n++;
    }
    }
      for(int i=1;i<=L;i++){
      for(int j=1;j<=L;j++){
        if(p[i][j]==3) p[i][j]=1;
      }
      }
    ++k;
    if(n==L*L) t=1;
    else n=0;
    }
    cout<<k;
    return 0;
}

27ms/ 10908kb。


总结

填充矩阵法。可以减少判断语句,将特殊一般化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大争天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值