ZOJ 3804--解题报告
题目相关:
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--解题报告的更多相关文章
- ZOJ 1093 Monkey and Banana (LIS)解题报告
ZOJ 1093 Monkey and Banana (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- zoj 2313 Chinese Girls' Amusement 解题报告
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求 ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
随机推荐
- hadoop集群配置实例
1)ssh配置 http://allthingshadoop.com/2010/04/20/hadoop-cluster-setup-ssh-key-authentication/ 2) 修改打开文件 ...
- Junit4的简单使用
junit4的简单使用 测试套件的使用 测试类1 package com.westward; import static org.junit.Assert.*; import org.junit.Te ...
- jQuery中的quickExpr
jQuery 源码中的 quickExpr 是用来检测参数 selector 是否是复杂的 HTML 代码(如“abc<div>”)或 #id,匹配结果存放在数组 match 中 // A ...
- 一模 (2) day2
第一题: 题目大意:给出n种物品和每种物品的件数,求拿k件的方案数.N<=30 解题过程: 1.一开始总想着是组合数学的模型,结果怎么都想不出来..然后写了个爆搜,数据很弱,只有1个点超时. 2 ...
- ros与下位机通信常用的c++ boost串口应用
一.首先移植c++ boost 库: 1. 先去 Boost官网 下载最新的Boost版本, 我下载的是boost_1_6_0版本, 解压. 2. 进入解压后目录: cd boost_1_6_0, 执 ...
- 近期C++编译问题汇总
编译c++ 代码中遇到几个问题,汇总一下: 1.编译openssl 遇到问题如图 , 原因:不支持汇编编译,在perl编译指令中加入: no-asm , 如:perl Configure VC-WI ...
- Windows Azure 实操 —— 迁移本地SharePoint服务器到Azure
博客地址 http://blog.csdn.net/foxdave 注意:如果你是第二代虚拟机,那就别看这个了,老老实实在Azure上重新创建吧,Azure不支持第二代虚拟机. 写在之前,对Azure ...
- lightoj1080 线段树
//Accepted 6628 KB 520 ms //I a b 把a到b区间的二进制位去反,转化成a到b区间的数全部加1 //Q a 判断第a位的奇偶 #include <cstdio> ...
- poj1179
//Accepted 244 KB 0 ms //区间dp //石子合并模型 #include <cstdio> #include <cstring> #include < ...
- FZU 2072 - Count
题意:给一个数组,每次查询输出区间内数字x出现的次数. 每次查询数字x是与其它数字无关的,所以我们可以以每个数字为索引建立一个链表,里面存放它出现的下标,这里可以保证是递增的.每次查询数字x,就在x的 ...