SJTUOJ 1003. 二哥养细菌

题目内容

题目描述
二哥不仅种苹果和花生,还养了很多细菌。二哥的细菌培养皿成方格形,边长为L。长期培养后,二哥发现了细菌繁殖的规律:最初每个格子里的细菌及其后代都会独立繁殖,每次繁殖都会在其上下左右四个相邻的格子里产生新的细菌,而已经存在的细菌在培养皿充满细菌之前都不会死亡。另外,有一些格子里可能还有抗生素,细菌在有抗生素的格子里无法繁殖。

二哥于是发明了一个游戏:取一个新的培养皿,在某些格子里放入细菌或抗生素,然后观察细菌不断繁殖直至充满整个培养皿的所有没有抗生素的格子。不过二哥已经对这个游戏厌烦了,他现在只想知道经过多少轮繁殖后,细菌会充满整个培养皿(不算有抗生素的格子)。

输入格式
第1行有1个整数,边长L。

第2行至第L+1行,每行有L个整数,取值为0、1或2。0表示格子里最初没有细菌,1表示格子里最初有细菌,2表示格子里最初有抗生素。

输出格式
输出一个整数m,表示经过m轮繁殖后,细菌会充满整个培养皿(不算有抗生素的格子)。

说明
【样例解释】 第一轮繁殖:

2 1 0
1 1 1
0 1 0

第二轮繁殖:

2 1 1
1 1 1
1 1 1

【数据范围】

对于全部数据:1≤L≤1001≤L≤100 ,保证最终能够充满培养皿(不算有抗生素的格子)。

Sample Input
3
2 0 0
0 1 0
0 0 0
Sample Output
2

代码实现及分析

标准广度优先搜索,预估了一下队列长度最大可能占半个地图(初始1,0相间隔),

#include 
#define LIM 5000
int main()
{
    int g[100][100],n,i,j,over,input;
    int queue[LIM] = {0};
    int qh = 0,qt = 0;
    
    while(scanf("%d",&n)!=EOF)
    {
        for(i = 0; i < n; i++){
            for(j=0;j<n;j++){
                scanf("%d", &input);
                if(2 == input){
                    g[i][j] = -1;
                }
                else{
                    g[i][j]=input;
                }
                if(1==g[i][j]){
                    queue[qt++] = i*100+j;
                }
            }
        }
        while(1){
            i = queue[qh]/100;
            j = queue[qh]%100;
            if(i > 0 && 0 == g[i-1][j]){
                queue[qt] = (i-1)*100+j;
                g[i-1][j]=g[i][j]+1;
                qt++;
                if(qt > LIM){
                    qt = 0;
                }
            }
            if(j > 0 && 0 == g[i][j-1]){
                queue[qt] = i*100+j-1;
                g[i][j-1]=g[i][j]+1;
                qt++;
                if(qt > LIM){
                    qt = 0;
                }
            }
            if(i < n-1 && 0 == g[i+1][j]){
                queue[qt] = (i+1)*100+j;
                g[i+1][j]=g[i][j]+1;
                qt++;
                if(qt > LIM){
                    qt = 0;
                }
            }
            if(j < n-1 && 0 == g[i][j+1]){
                queue[qt] = i*100+j+1;
                g[i][j+1]=g[i][j]+1;
                qt++;
                if(qt > LIM){
                    qt = 0;
                }
            }
            qh++;
            if(qh >= LIM){
                qh = 0;
            }
            if(qh == qt){
                break;
            }
        }
        over = (qh - 1 + LIM) % LIM;
        i = queue[over]/100;
        j = queue[over]%100;
        printf("%d\n",g[i][j]-1);
    }
    return 0;
}

时间:26ms 空间:9452kb

你可能感兴趣的:(SJTUOJ)