计蒜客 the game of life

2017 icpc 南宁 the game of life 

#include <bits/stdc++.h>
using namespace std;
const int maxn  = 600;
const int sz = 300;
struct point{
    int r,c,tim;
    point( int _r,int _c,int _tim ){
        r = _r;c = _c;tim = _tim;
    }
};
queue<point> que;
stack<point> st1,st2;
int a[maxn][maxn],inst2[maxn][maxn];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        while(que.size()) que.pop();
        memset( a,0,sizeof(a) );
        int n,m;
        scanf("%d%d",&n,&m);
        for( int i = 1;i <= n;i++ ){
            getchar();
            for( int j = 1;j <= m;j++ ){
                char c = getchar();
                a[i+sz][j+sz] = c=='#';
                if( c == '#' ){
                    que.push( point( i+sz,j+sz,0 ) );
                }
            }
        }
        int ans = que.size(),res = 0;
        for( int i = 1;i <= 321;i++ ){
            while(1){
                if( que.front().tim == i || !que.size() ) break;
                point cur = que.front();que.pop();
                int c = 0;
                for( int x = -1;x <= 1;x++ ){
                    for( int y = -1;y <= 1;y++ ){
                        if( x|| y ){
                          if( a[cur.r+x][cur.c+y] ){
                              c++;
                          }
                        }
                    }
                }
                if( c == 2 || c == 3 ){
                    que.push( point( cur.r,cur.c,i ) );
                }else st1.push(cur);
                for( int x = -1;x <= 1;x++ ){
                    for( int  y = -1; y <= 1;y++ ){
                        if( x || y ){
                            int _x = cur.r + x;
                            int _y = cur.c + y;

                            if( a[_x][_y] || inst2[_x][_y] ) continue;
                            int cc = 0;
                            for( int xx = -1;xx <= 1;xx++ ){
                                for( int yy = -1;yy <= 1;yy++ ){
                                    if( xx || yy ) {
                                        int _xx = _x + xx;
                                        int _yy = _y + yy;
                                        if (a[_xx][_yy]){
                                            cc++;
                                        }
                                    }
                                }
                            }
                            if( cc == 3 ){
                                st2.push( point( _x,_y,i ) );
                                que.push( point( _x,_y,i ) );
                                inst2[_x][_y] = 1;
                            }
                        }
                    }
                }
            }
            while(st1.size() ){
                point cur = st1.top();
                st1.pop();
                a[ cur.r ][ cur.c ] = 0;
            }
            while(st2.size()){
                point cur = st2.top();
                st2.pop();
                a[cur.r][cur.c] = 1;
                inst2[cur.r][cur.c] = 0;
            }
            if( que.size() > ans ){
                ans = que.size();
                res = i;
            }
        }
        printf("%d %d %d\n",res,ans,que.size());
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值