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代码整合
随机推荐
- POJ 2965 The Pilots Brothers' refrigerator 暴力 难度:1
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16868 ...
- UVa 11021 - Tribles
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码
转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...
- wp8.1 Study10:APP数据存储
一.理论 1.App的各种数据在WP哪里的? 下图很好介绍了这个问题.有InstalltionFolder, knownFolder, SD Card... 2.一个App的数据存储概览 主要分两大部 ...
- const的全面理解
const关键字用来作甚?const是一个类型修饰符.常见的类型修饰符有哪些? short long unsigned signed static autoextern register 定义一个变量 ...
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(三)
最近写了个Matlab程序,好慢呐……所以开始学习Matlab与C/C++混合编程.下面写了个测试代码,显示一个Double类型矩阵中的元素. 源代码 #include "mex.h&quo ...
- ajax异步文件上传,iframe方式
不是我写的,我看了他的,思路很明确: 实现思路: 在js脚本中动态创建form,动态创建form中的内容,将文件上传的内容以隐藏域的方式提交过去,然后写好回调等. 感觉思路不难,但是我写不出来,感觉需 ...
- Browser GetImage
using Microsoft.Win32; using System; using System.ComponentModel; using System.Drawing; using System ...
- poj2891 拓展欧几里得
//Accepted 164 KB 16 ms //拓展欧几里得 //m=a1*x+b1 --(1) //m=a2*(-y)+b2 --(2) //->a1*x+a2*y=b2-b1 //由欧几 ...
- Oracle数据库DECODE函数的使用.
decode函数是Oracle数据库独有的. 语法为: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 例子:select decode(sign(变量1-变量2) ...