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;
}