1. 程式人生 > 實用技巧 >2017 南寧區域賽 icpc H. The Game of Life

2017 南寧區域賽 icpc H. The Game of Life

這題直接模擬,按照題目所給的約束,模擬每輪每個位置格子的死活狀況,一個優化就是隻要紀錄上一輪活著的位置的x最大值,最小值,y的最大值最小值,然後這輪在這個範圍+1模擬就可以了,因為
活著的格子數不會很多,所以這個範圍也不會很大,所以不會超時

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[1000][1000];
char b[1000][1000];
int js(int x,int y){
    int cnt=0;
    for(int i=-1;i<=1;i++){
        for(int j=-1;j<=1;j++){
            if(i==0&&j==0)continue;
            cnt=cnt+(a[x+i][y+j]=='#');
        }
    }
    return cnt;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        memset(a,'\0',sizeof(a));
        memset(b,'\0',sizeof(b));
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i=330;i<=370;i++){
            for(int j=330;j<=370;j++){
                a[i][j]='.';
            }
        }
        for(int i=1;i<=n;i++){
            scanf("%s",a[350+i]+350);
        }
        int xmin=1e9,xmax=0;
        int ymin=1e9,ymax=0;
        int cnt=0;
        for(int i=330;i<=370;i++){
            for(int j=330;j<=370;j++){
                if(a[i][j]=='#'){
                    cnt++;
                    xmin=min(xmin,i);
                    xmax=max(xmax,i);
                    ymin=min(ymin,j);
                    ymax=max(ymax,j);
                }
            }
        }
        int maxn=cnt,w=0;
        for(int k=1;k<=321;k++){
            cnt=0;
            for(int i=max(xmin-1,0);i<=xmax+1;i++){
                for(int j=max(ymin-1,0);j<=ymax+1;j++){
                    if(a[i][j]=='#'){
                        if(js(i,j)==2||js(i,j)==3){
                            b[i][j]='#';
                        }
                        else{
                            b[i][j]='.';
                        }
                    }
                    else{
                        if(js(i,j)==3){
                            b[i][j]='#';
                        }
                        else{
                            b[i][j]='.';
                        }
                    }
                }
            }
            int tempx1=max(xmin-1,0);
            int tempx2=xmax+1;
            int tempy1=max(ymin-1,0);
            int tempy2=ymax+1;
            xmin=1e9;xmax=0;
            ymin=1e9;ymax=0;
            for(int i=tempx1;i<=tempx2;i++){
                for(int j=tempy1;j<=tempy2;j++){
                    a[i][j]=b[i][j];
                    if(a[i][j]=='#'){
                        xmin=min(xmin,i);
                        xmax=max(xmax,i);
                        ymin=min(ymin,j);
                        ymax=max(ymax,j);
                        cnt++;
                    }
                }
            }
             
            if(maxn<cnt){
                maxn=cnt;
                w=k;
            }
        }
        //printf("%d %d %d %d\n",xmin,xmax,ymin,ymax);
        printf("%d %d %d\n",w,maxn,cnt);
    }
}
/*
3
3 3
...
##.
.#.
3 3
.#.
...
###
3 3
...
###
...
*/