ZOJ 3804 YY's Minions
简单的模拟题
初始时 每个点都有两种状态 0 1 然后判断每个点周围八个方向中相邻点的状态 判断状态为1的个数
注意点状态变为X是在每秒钟的末尾 所以要在每秒钟的末尾对状态进行改变
用两个数组对前一秒的状态跟这一秒的状态分别进行存储
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
char map[55][55];
char map2[55][55];
bool vis[55][55];
int change[55][55];
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
int main()
{
//freopen("ceshi.txt","r",stdin);
int tc;
scanf("%d",&tc);
while(tc--)
{
int n,m,f,k;
scanf("%d%d%d%d\n",&n,&m,&f,&k);
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
strcpy(map2[i],map[i]);
}
MEM(vis,0);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
change[i][j]=f+1;
int t,x,y;
for(int i=0;i<k;i++)
{
scanf("%d%d%d",&t,&x,&y);
change[x-1][y-1]=t;
}
for(int i=1;i<=f;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<m;k++)
{
int num=0;
if(map[j][k]=='X')
{
map2[j][k]='X';
continue;
}
for(int x=0;x<8;x++)
{
if((j+dir[x][0])<0||(j+dir[x][0])>=n||(k+dir[x][1])<0||(k+dir[x][1])>=m)
continue;
char c=map[j+dir[x][0]][k+dir[x][1]];
if(c=='1') num++;
}
if(map[j][k]=='0')
{
if(num==3) map2[j][k]='1';
else map2[j][k]=map[j][k];
}
else
{
if(num!=2&&num!=3)
map2[j][k]='0';
else map2[j][k]=map[j][k];
}
}
}
for(int j=0;j<n;j++)
{
strcpy(map[j],map2[j]);
for(int k=0;k<m;k++)
{
if(i==(change[j][k]))
{
map[j][k]='X';
}
}
}
// cout<<"ii "<<i<<endl;
// for(int y=0;y<n;y++)
// printf("%s\n",map[y]);
}//时间
// puts("");
for(int i=0;i<n;i++)
printf("%s\n",map[i]);
}
return 0;
}