题目背景

  小学五六年级的乔猫是一个喜欢不务正业写游戏的孩纸$......$他曾经模仿著名的沙盒游戏《$Minecraft$》做过一个自己的游戏$"NEWorld"$。这两个游戏有着相同的规则,都是通过在一个满是方块组成的$3D$世界中,放置不同的方块来建造各种各样的东西。对了,游戏中还有一个独特的“近似全局光照”的亮度系统$......$为了简单,我们只考虑二维的情况吧。


题目描述

  在一个$N$行$M$列的网格中,第$i$行$j$列的格子有一个可变的“亮度”$L_{ij}$(初始时都为$0$)和一个固定的“不透光度”$A_{ij}$。现在在$r$行$c$列放入一个亮度为$l$的光源,$NEWorld$游戏引擎会根据以下逻辑,让光源逐步“照亮”附近的方格:
  先将光源所在方格的亮度$L_{rc}$赋值为$l$。而对于$i$行$j$列一个不是光源的方格,它的亮度由$A_{ij}$和四周方格的亮度所确定。定义$F(i,j)=\max\{L_{i−1,j},L_{i+1,j},L_{i,j−1},L_{i,j+1},A_{ij}\}−A_{ij}$(此处当$1\leqslant i'\leqslant N$不成立或$1\leqslant j'\leqslant M$不成立时,$L_{i'j'}$被看作是$0$),我们称方格$(i,j)$的亮度$L_{ij}$是“有效”的,当且仅当$L_{ij}=F(i,j)$。显然初始时所有亮度都是“有效”的,而放入光源后则可能存在亮度“无效”的方格。
  现在引擎会循环执行操作,每一步找出当前所有亮度“无效”(不包括光源)的方格中,行数$i$最小的那一个(如果有多个行数$i$最小的,就选择其中列数$j$最小的方格),然后计算$F(i,j)$的值,将其赋值给$L_{ij}$。操作会不停地执行,直到所有亮度都“有效”为止(请参考样例,循环一定会在有限步操作后结束)。请问最后$p$行$q$列的方格亮度值$L_{pq}$是多少?
  注:$\max\{a,b,c,d,e\}$表示取$a,b,c,d,e$中最大的值。


输入格式

  输入文件名为$neworld.in$。
  输入文件第一行两个正整数$N,M$,表示网格大小为$N$行$M$列。
  接下来的$N$行,每行$M$个正整数,其中第$i$行$j$列的正整数为$A_{ij}$。
  最后一行包含五个正整数$r,c,l,p,q$,表示在$r$行$c$列放入亮度为$l$的光源,需要查询的是亮度计算完成后$p$行$q$列的亮度值。


输出格式

  输出文件名为$neworld.out$。
  输出文件包含一行一个正整数,表示最后$L_{pq}$的值。


样例

样例输入:

4 4
1 1 1 1
1 4 4 1
1 1 4 1
1 1 1 1
3 2 4 1 1

样例输出:

1


数据范围与提示

样例解释:

  这张图展示了亮度重新计算的过程。数字表示方格亮度$L_{ij}$,白色方格为光源,灰色方格的灰度表示该方格的不透光度$A_{ij}$(浅灰为$1$深灰为$4$),绿色方格是亮度“无效”的方格,其中深绿色是即将被重新计算亮度的方格。

数据范围:

  对于$60\%$的数据:$N,M\leqslant 100$。
  对于$100\%$的数据:$N,M\leqslant 500,1\leqslant A_{ij},l\leqslant 10^9,1\leqslant r,p\leqslant N,1\leqslant c,q\leqslant M$。


题解

正解是$Dijkstra$,但是由于出题人并不会卡$BFS$,于是他只卡了$SPFA$……

所以直接$BFS$就好了,表现蛮好的。

时间复杂度:$\Theta($玄学$)$。

期望得分:$60$分。

实际得分:$100$分。


代码时刻

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int N,M;
  4. int A[600][600],F[600][600];
  5. int r,c,l,p,q;
  6. queue<pair<int,int> > que;
  7. void BFS()
  8. {
  9. while(que.size())
  10. {
  11. pair<int,int> flag=que.front();que.pop();
  12. int i=flag.first,j=flag.second;
  13. if(i>1)
  14. {
  15. if(F[i][j]>F[i-1][j]+A[i-1][j])
  16. {
  17. F[i-1][j]=F[i][j]-A[i-1][j];
  18. que.push(make_pair(i-1,j));
  19. }
  20. }
  21. if(i<N)
  22. {
  23. if(F[i][j]>F[i+1][j]+A[i+1][j])
  24. {
  25. F[i+1][j]=F[i][j]-A[i+1][j];
  26. que.push(make_pair(i+1,j));
  27. }
  28. }
  29. if(j>1)
  30. {
  31. if(F[i][j]>F[i][j-1]+A[i][j-1])
  32. {
  33. F[i][j-1]=F[i][j]-A[i][j-1];
  34. que.push(make_pair(i,j-1));
  35. }
  36. }
  37. if(j<M)
  38. {
  39. if(F[i][j]>F[i][j+1]+A[i][j+1])
  40. {
  41. F[i][j+1]=F[i][j]-A[i][j+1];
  42. que.push(make_pair(i,j+1));
  43. }
  44. }
  45. }
  46. }
  47. int main()
  48. {
  49. scanf("%d%d",&N,&M);
  50. for(int i=1;i<=N;i++)
  51. for(int j=1;j<=M;j++)
  52. scanf("%d",&A[i][j]);
  53. scanf("%d%d%d%d%d",&r,&c,&l,&p,&q);
  54. F[r][c]=l;
  55. que.push(make_pair(r,c));
  56. BFS();
  57. printf("%d",F[p][q]);
  58. return 0;
  59. }

rp++

[CSP-S模拟测试]:新的世界(BFS)的更多相关文章

  1. csp-s模拟测试90

    csp-s模拟测试90 考场发明$Spfa$祭. $T1$按照题意模拟,然后我就发现我死了.一气之下删掉了$priority$,拍了几下发现贼jb快而且还是对的就开心地交了.$T2$的差分状态定义很棒 ...

  2. [考试反思]1027csp-s模拟测试90:自我

    其实这套题很好. 但是这次,在T1爆炸的同时,T2和T3并没有出现能弥补的表现. 在AK仍然存在的同时,我居然连一个AC都没有. 所以最后就是一无是处的一场. 考试结束前估分:100+100+30=2 ...

  3. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  4. [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)

    题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...

  5. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  6. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  8. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  9. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

随机推荐

  1. 关于c++对拍的办法

    众所周知,在\(oi\)学习以及考试中,对拍是一件非常重要的事. 有了对拍后,我们可以利用它发现代码上的一些非常难看出来的错误. 编写对拍程序一般有两个办法. 方案一 编写一个对拍的\(cpp\),并 ...

  2. C++对象在继承情况下的内存布局

    1,C++ 中继承是非常重要的一个特性,本节课研究在继承的情形下,C++ 的对象模 型又有什么不同: 2,继承对象模型(最简单的情况下): 1,在 C++ 编译器的内部类可以理解为结构体: 2,子类是 ...

  3. 创建一个py文件并运行

    在 Linux 中,可以直接用vim 或者 vi 来编辑一个 python 文件 vim hello.py 进入编辑页面 #coding:utf-8 print("你好") (因为 ...

  4. P5596 洛谷月赛 题 题解

    因为a>=0,b>=0,所以y^2-x^2>=0,所以y>x,因为都是自然数设y=x+k,化简得x=b-k^2/2*k-a;可知x仅当b-k^2%2*k-a==0且b-k^2与 ...

  5. Codeforces 1215D. Ticket Game

    传送门 博弈,发现情况有点多,分析一下把有用的状态提取出来 显然各个位置的数字是没用的,我们只要知道两边的数字和分别是多少 并且状态显然和左右两边的 "?" 数量有关 因为最终我们 ...

  6. Doker GRPC "Connection reset by peer"

    https://success.docker.com/article/ipvs-connection-timeout-issue https://forums.docker.com/t/setting ...

  7. {经典}springmvc+mybatis+restful+webservice Jeesz分布式架构

    框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件组件.代码生成等.采用 ...

  8. JSP的9大内置对象和4打作用域对象

    一.9大内置对象 二.4大内置作用域对象

  9. pip 安装超时解决方案

    已经使用梯子,安装某依赖时仍然超时. 首先检查pip的版本是否需要更新,如果不是最新版本运行命令更新: python -m pip install --upgrade pip 如果仍然超时错误,则运行 ...

  10. python-函数4(递归、高阶函数)

    python-函数4(递归.高阶函数) 递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归特性: 1. 递归必须有一个明确的结束条件 2. 每次进入更深一 ...