题目链接:点击查看

题目大意:给出一个 n * m 的 01 矩阵,矩阵每一秒都会迭代,迭代规则如下:

  1. 如果对于 ( x , y ) 格子而言,四周相邻的格子 ( xx , yy ) 均满足 maze[ x ][ y ] != maze[ xx ][ yy ] ,则 maze[ x ][ y ] 不变
  2. 否则 maze[ x ][ y ] ^ = 1

给出 q 个询问,每个询问问格子 ( x , y ) 在第 t 秒迭代后的数字为多少

题目分析:直接用题解的话来说吧,满足规则 1 的点我们称为 good 点,其余的点称为 bad 点,每次迭代,当且仅当某个点为 good 点时才发生迭代,而对于 bad 点而言,如果四周存在至少一个 good 点,那么该 bad 点在完成一轮迭代后也会变成 good 点,反之不变

换句话说, good 点是会不断扩散的,而 bad 点的数量相应是不增加的,这样我们就能用 bfs 求出任意一个点 ( x , y ) 在整个过程中是否会发生迭代,在第几秒时会发生迭代,当求出这些信息后,就能 O(1) 回答所有询问了

至于 bfs ,可以视为多源 bfs ,将初始时为 good 的点全部加入到队列中,然后不断扩散就好了,最后判断的时候:

  1. 如果点 ( x , y ) 不会发生迭代,那么直接输出 maze[ x ][ y ] 即可
  2. 如果点 ( x , y ) 发生了迭代:
    1. 如果当前时间 t 小于点 ( x , y ) 的起始迭代时间,说明该点还没有发生迭代,输出 maze[ x ][ y ] 即可
    2. 否则根据 t 与 开始迭代的时间之差的奇偶性来输出

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;const int b[4][2]={0,1,0,-1,1,0,-1,0};int n,m,q;int maze[N][N],f[N][N];bool vis[N][N];bool check(int x,int y)
{for(int i=0;i<4;i++){int xx=x+b[i][0];int yy=y+b[i][1];if(xx<=0||yy<=0||xx>n||yy>m)continue;if(maze[x][y]==maze[xx][yy])return true;}return false;
}void bfs()
{queue<pair<int,int>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(check(i,j)){q.push(make_pair(i,j));vis[i][j]=true;f[i][j]=0;}while(q.size()){int x=q.front().first;int y=q.front().second;q.pop();for(int i=0;i<4;i++){int xx=x+b[i][0];int yy=y+b[i][1];if(xx<=0||yy<=0||xx>n||yy>m)continue;if(vis[xx][yy])continue;f[xx][yy]=f[x][y]+1;vis[xx][yy]=true;q.push(make_pair(xx,yy));}}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%1d",&maze[i][j]);bfs();while(q--){int x,y;LL t;scanf("%d%d%lld",&x,&y,&t);if(vis[x][y])//进行过迭代 {if(f[x][y]>t)//没到迭代时间 printf("%d\n",maze[x][y]);elseprintf("%d\n",maze[x][y]^((t-f[x][y])&1));}else//没进行过迭代 printf("%d\n",maze[x][y]);}return 0;
}

CodeForces - 1350E Orac and Game of Life(bfs)相关推荐

  1. Orac and Game of Life CodeForces - 1350E(思维+BFS)

    Please notice the unusual memory limit of this problem. Orac likes games. Recently he came up with t ...

  2. 【CodeForces - 190E】Counter Attack (补图bfs,卡常,dsu)

    题干: 无向图中给定n个顶点,m条不存在的边(除了这m条边,其余都存在),求图的连通分量,及每个连通分量的大小. 解题报告: https://codeforces.com/blog/entry/455 ...

  3. 【CodeForces - 129C】Statues(思维,bfs)

    题干: In this task Anna and Maria play a game with a very unpleasant rival. Anna and Maria are in the ...

  4. Codeforces 912 D. Fishes (贪心、bfs)

    题目链接:Fishes 题意: 有一个n×m的鱼塘,有一张r×r的渔网,现在往池塘里面放k条鱼(每个格子只能放一条鱼), 现在撒网的地方是随机的(必须在池塘内),问能捕的鱼的期望值最大是多少? 题解: ...

  5. Codeforces 750D New Year and Fireworks 暴力BFS

    点击打开链接 n<=30 t[i]<=5 算重复的有2^30个 但是每层最多只能使地图半径扩大5,所以直径最大为300 所有点都落在300*300矩形内 不重复的点只有9e4个,bfs暴力 ...

  6. CodeForces - 1350B Orac and Models(dp)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,求出最长上升子序列的长度,满足前一个的下标是后一个下标的因子 题目分析:读懂题后不难发现这是 n * n 最长不下降子序列模板题目的变形题,只 ...

  7. CodeForces - 1350C Orac and LCM(数论)

    题目链接:点击查看 题目大意:给出 n 个数,先求出两两 lcm 后的集合 t ,再求这个集合 t 的 gcd 题目分析:做这个题得知道一个前置知识:对于 lcm 和 gcd 运算来说,每个质因子都相 ...

  8. CodeForces - 1350D Orac and Medians(思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,以及一个数字 k ,每次操作可以将一段连续区间 [ l , r ] 内的数字全部替换成该区间的中位数,问能否通过适当的操作使得整个数列的 n ...

  9. codeforces D. Orac and Medians

    题目 题意: 你可以将一个区间的值全部赋值成中位数的值,问最后能不能把值全部都赋值成kkk. 思路: 先介绍一个中文官方题解 我们按照题解中的,我们先设置ai={0ai< k1ai= k2ai& ...

最新文章

  1. 做过十几年程序员,作为当今全世界顶级产品经理,出版第二部重磅作品《启示录2》...
  2. 2018年春季个人阅读计划
  3. Spring boot配置文件随机数
  4. Oracle取最大值问题
  5. LoadRunner界面分析(二)
  6. 远控免杀4---Evasion免杀
  7. python requests get post_python+requests进行get、post方法接口测试
  8. Oracle单个数据文件超过32G后需要扩容
  9. Go Web编程--使用bcrpyt哈希用户密码
  10. 网络驱动器映射成功但无法更新文件_我的电脑访问NAS像打开本地硬盘那样打开网络NAS...
  11. Hadoop HIVE 基本函数
  12. SSL 中证书能否够使用IP而不是域名
  13. Winsock传输数据
  14. 基于CarMaker的C-NCAP主动安全系统试验仿真(一)
  15. matlab符号运算求二阶微分方程,matlab二阶微分方程求解x 0.2x 0.4x=0.2u(t)
  16. ABAQUS二次开发手册【随书代码使用说明】
  17. HTML|下拉框和文本域、文件域
  18. DSB matlab仿真
  19. 让我们的爱洒满孩子们的心
  20. [WARNING IsDockerSystemdCheck]: detected “cgroupfs“ as the Docker cgroup driver. The recommended dri

热门文章

  1. java9新特性 2017_Java 9 ← 2017,2019 → Java 13 ,来看看Java两年来的变化
  2. Redis操作List相关API
  3. Redis操作List类型
  4. Apollo核心概念
  5. 存储过程语法 - 变量
  6. Nginx server_name正则表达式匹配配置
  7. BeanDefinition构建示例
  8. Arrays练习:字符串倒序排列
  9. SpringBoot_配置-@Conditional自动配置报告
  10. 把c++语言转换为go的工具_V,新编程语言来袭!与Go类似,跟C一样快