上海交大OJ1003二哥养细菌


问题概述

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


算法分析

思路很简单,就是一次一次的遍历整个矩阵,遇到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。


总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
我这个是正版KEY,需要上官网领取,虽然最新是4.0的,但是领取的3.0版本的也是够用的,我去年还是花了近百元在特价打折的情况下买的,4.0的可以淘宝上购买,3.0的就从我这个文件里附带的链接地址去领取的,详细说明在里面,里面多一个步骤。 Revo Uninstaller是一款免费好用的专业卸载软件,能够帮助用户轻松的卸载所有的Windows应用程序,是一款不可多得的实用型系统工具,需要的朋友快来带走它吧。 卸载软件 【基本介绍】 Revo Uninstaller 凭借其先进和快速的算法,彻底分析和扫描程序在系统和注册表中的所有文件和键值,将程序彻底完全的移除,不会在系统中留下软件的任何残留!Revo Uninstaller Pro有一个非常强大的功能,称为强制卸载。 强行卸载是最好的解决方案,你必须删除顽固程序,部分已安装的程序,部分卸载的程序!完全删除程序,不留痕迹,你可以监控所有系统安装过程中所做的更改, 然后使用这些信息来卸载它。 除此之外,Revo Uninstaller (卸载软件)还包括其它一些实用的功能。例如:能够帮助你清除系统中的LJ文件,无用的Office临时文件,上网记录,系统启动项管理等。 【软件特点】 追踪安装模式可监测软件的安装过程中文件和注册表的读写,对于卸载尤其是对于制作绿色便携版软件非常有用. 强制卸载本身没有卸载程序或者卸载时出现错误的软件; 猎人模式:一键点击卸载、停止、删除应用程序; 附带很多实用工具,如自动启动管理员、垃圾文件清理器、Windows工具、浏览清理器、Office 清理器、Windows清理器、形迹移除器、永久性删除工具和备份管理员功能! 程序启动后,是英文版,可设置成中文,如下图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大争天下

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

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

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

打赏作者

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

抵扣说明:

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

余额充值