本文主要是介绍ZOJ 3804 YY's Minions,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 __int64using 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;
}
这篇关于ZOJ 3804 YY's Minions的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!