2017 南寧區域賽 icpc H. The Game of Life
阿新 • • 發佈:2020-10-04
這題直接模擬,按照題目所給的約束,模擬每輪每個位置格子的死活狀況,一個優化就是隻要紀錄上一輪活著的位置的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 ... ### ... */