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