题目相关:
  3804相关链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5336
  宠物(minion)在N*M的矩形玩游戏, 0表示睡眠(sleep), 1表示清醒(awake), 每一轮按照一定的规则进行状态变迁
  具体的游戏规则如下:
  1). 每个宠物在清醒状态(awake 1)时, 若太孤单(周边awake minion数<2), 太吵闹(周边awake minion数>3), 则转为睡眠状态(sleep 0) 
  2). 每个宠物在睡眠状态(sleep 0)时, 若周边awake minion数刚好为3时, 则该宠物进入清醒状态
  3). 宠物会觉得这个游戏无聊, 在某一个时刻, 选择离开, 状态转为'X'
  邻近关系以周边8个方向为依据.

思路解析:
  本体为模拟题, 简单模拟即可. 唯一需要注意的是, 迭代的次数很多, 可以借助滚动数组的优化技巧来解决.

AC代码:

#include <cstdio>

#include <vector>

#include <algorithm>

struct move_t {
int t;
int x;
int y;
move_t(int t = 0, int x = 0, int y = 0)
: t(t), x(x), y(y) {
}
}; struct compare_func_t {
bool operator() (const move_t &lhs, const move_t &rhs) const {
return lhs.t < rhs.t;
}
}; // *) 用于统计周边字符为 ch 的个数
inline int sensor(char cmap[64][64], int n, int m, int y, int x, char ch) { // *) 遍历八角的范围
static int DIRECIONS[8][2] = {
{1, 0}, {-1, 0}, {0, 1}, {0, -1},
{1, 1}, {-1, 1}, {1, -1}, {-1, -1}
}; int result = 0;
for ( int i = 0; i < 8; i++ ) {
int dx = x + DIRECIONS[i][0];
int dy = y + DIRECIONS[i][1];
if ( dx >= 0 && dx < m && dy >= 0 && dy < n ) {
if ( cmap[dy][dx] == ch ) {
result ++;
}
}
}
return result; } int main()
{ int kase;
int n, m, f, k;
char data[2][64][64]; scanf("%d", &kase);
while ( kase-- > 0 ) {
scanf("%d%d%d%d", &n, &m, &f, &k);
int before = 0, after = 1;
for ( int i = 0; i < n; i++ ) {
scanf("%s", data[before][i]);
} int forward = 0;
std::vector<move_t> moves;
int t, x, y;
for ( int i = 0; i < k; i++ ) {
scanf("%d%d%d", &t, &y, &x);
moves.push_back(move_t(t, x, y));
}
std::sort(moves.begin(), moves.end(), compare_func_t()); for ( int i = 0; i < f; i++ ) { // *) 一轮迭代, 进行状态变化
for ( int s = 0; s < n; s++ ) {
for ( int k = 0; k < m; k++ ) {
data[after][s][k] = data[before][s][k];
if ( data[before][s][k] == '0' ) {
int val = sensor(data[before], n, m, s, k, '1');
if ( val == 3 ) {
data[after][s][k] = '1';
}
} else if ( data[before][s][k] == '1' ) {
int val = sensor(data[before], n, m, s, k, '1');
if ( val < 2 || val > 3 ) {
data[after][s][k] = '0';
}
}
}
} // *) 有人离开游戏
while ( forward < moves.size() ) {
const move_t &mv = moves[forward];
if ( mv.t <= i + 1 ) {
data[after][mv.y - 1][mv.x - 1] = 'X';
forward++;
} else {
break;
}
} // *) 滚动数组进行切换
before ^= after ^= before ^= after; } // *) 输出结果
for ( int i = 0; i < n; i++ ) {
data[before][i][m] = '\0';
printf("%s\n", data[before][i]);
} }
return 0;
}

ZOJ 3804--解题报告的更多相关文章

  1. ZOJ 1093 Monkey and Banana (LIS)解题报告

    ZOJ  1093   Monkey and Banana  (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. zoj 2313 Chinese Girls' Amusement 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求 ...

  3. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  4. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  5. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  6. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  7. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  8. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  9. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  10. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

随机推荐

  1. P264练习题1.2题

    package 集合; import java.util.*; public class fourteen { public static void main(String[] args) { //1 ...

  2. 超简单的NDK单步调试方法

    令人兴奋的是,ADTr20已经支持JNI单步调试,再也不需要如上这么麻烦的步骤了 你现在需要做的只需以下2步: 1.使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之 ...

  3. WCF中常见的几种Host,承载WCF服务的方法

    1:写在前面 我们都知道WCF在运行的时候必须自己提供宿主来承载服务.WCF 本身没有附带宿主,而是提供了一个 ServiceHost 的类,该类允许您在自己的应用程序中host WCF 服务.然后调 ...

  4. windbg调试C#代码(二)

    这篇主要讲如何分析高内存和高CPU. 1.如何分析高内存 注:如果抓Dump的同时,刚好在执行GC,抓出来的Dump执行命令多半会出错,用!VerifyHeap也能验证Dump有误,这种情况只能重新抓 ...

  5. wp8.1 Study1: 页面导航&页面间值传递

    摘要:wp8.1与wp8中很多API是不一样了,wp8.1把以前wp7.x时的api去掉了,更多与win8.1的API相似.比如以下的页面导航和页面之间的值传递 1.页面导航 利用Frame.Navi ...

  6. Gartner报告:多数CIO还未对数字化做好准备

    数字化经济时代已经来临.对于消费者而言,这意味着他们能够随时随地以更加丰富多彩的方式与虚拟世界和现实世界进行互动.对于企业而言,这意味着它们的运营将发生巨大变化,同时也有机会更加深入地了解客户并将这些 ...

  7. (转载)重新对APK文件签名

    1.将证书(debug.keystore)复制到与需要重新签名的apk文件相同的目录下(如:复制到D:\Sign) 2.在cmd中切换到需要重新签名的apk文件的目录下 3.使用WinRAR打开要重新 ...

  8. powershell玩转xml之20问

    powershell玩转xml之20问 powershell 传教士 原创文章 2014-01-30,2015-10-27改 允许转载,但必须保留名字和出处,否则追究法律责任 问:xml文件编码情况如 ...

  9. Apache Ant运行时Unable to locate tools.jar解决方法

    下载Apache Ant 一.解压ant安装包在D:\ant下 二.环境变量配置 ANT_HOME D:\ant\apache-ant-1.9.0 CLASSPATH ;%ANT_HOME%lib; ...

  10. Android常见控件— — —TextView

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...