http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3804
根据题意,一秒一秒的模拟就可以啦,注意要用一张新的图 来存新的状态
#include<bits/stdc++.h> using namespace std; int ma[55][55]; int f,k; struct node{ int x,y,t; }p[2555]; int n,m; bool cp(node x,node y) { return x.t<y.t; } bool check(int x,int y) { if(x<0||x>=n||y<0||y>=m||ma[x][y]==0||ma[x][y]==2) { return 0; } return 1; } int main(){ int t; cin>>t; while(t--) {scanf("%d%d",&n,&m); scanf("%d%d",&f,&k); char cc[55]; for(int i=0;i<n;i++) { scanf("%s",cc); for(int j=0;j<m;j++) { ma[i][j]=cc[j]-'0'; } } int zz=0; for(int i=0;i<k;i++) { scanf("%d%d%d",&p[i].t,&p[i].x,&p[i].y); p[i].x--; p[i].y--; } sort(p,p+k,cp); int maa[55][55]; int js=0; while(js<f) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ma[i][j]==2)continue; int tt=0; if(check(i+1,j)) tt++; if(check(i,j+1)) tt++; if(check(i+1,j+1)) tt++; if(check(i-1,j)) tt++; if(check(i,j-1)) tt++; if(check(i-1,j-1)) tt++; if(check(i+1,j-1)) tt++; if(check(i-1,j+1)) tt++; if(tt==3) { maa[i][j]=1; } else if(tt==2&&ma[i][j]==1) { maa[i][j]=1; } else maa[i][j]=0; } } js++; while(p[zz].t==js&&zz<k) { maa[p[zz].x][p[zz].y]=2; zz++; } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { ma[i][j]=maa[i][j]; } } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ma[i][j]==2) { printf("X"); } else printf("%d",ma[i][j]); } printf("\n"); } } return 0; }