在一个n行m列的网格中,某些位置存在一些水滴。嘟嘟进行q次打水滴操作,每次嘟嘟在某一个网格当中添加一个水滴,当某一网格中的水滴数量超过L时,该网格中的水滴变为四个水滴,并分别向上下左右四个方向飞出,每个飞出的水滴如果遇到一个包含水滴的网格时,则该水滴停在该网格当中,如果一直没有遇到,则该水滴将飞出网格。所有水滴移动的速度都相同,每秒移动一格。如果最终时刻所有网格中都不包含水滴,则嘟嘟取得了胜利。

注意:如果同一秒有多个水滴同时进入一个网格,那么应该等所有水滴都进入以后再会破裂。q次打水滴,嘟嘟都会等到不在有水滴移动了以后才会滴下一滴水滴。每次打水滴操作后,直到所有水滴都不再移动,才会进行下一次的打水滴操作。

输入格式

第一行包含三个整数n,m(1≤n,m≤100),L(5≤L≤10)。

接下来n行每行包含m个整数,每个整数在区间[0,L]范围内,表示每个网格中的水滴数量。

接下来一行包含一个整数q(q≤2500)。

接下来q行每行包含两个整数x,y(1≤x≤n,1≤y≤m),表示嘟嘟每次添加水滴的位置。

输出格式

对于每组测试数据,如果所有水滴都消失,则输出"YES",否则第一行输出"NO",接下来n行每行输出m个整数,表示每个网格中的水滴数量。

输入样例1


输出样例1

YES

输入样例2


输出样例2

NO
 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const double PI = acos(-);
const double eps =1e-;
#define Bug cout<<"---------------------"<<endl
const int maxn=1e7+;
using namespace std; int n,m,L;
int G[][];
int tm[][];//记录每个位置水滴破开的时间
struct node
{
int x,y;//坐标
int pos;//记录移动方向
int time;//记录时间
};
int NT[][]={{-,},{,},{,},{,-}}; void BFS(int x,int y)
{
node now,to;
queue<node> qe;
G[x][y]++;
if(G[x][y]>L)//如果会破开才会BFS
{
for(int i=;i<;i++)//4个方向都要有
{
now.x=x;
now.y=y;
now.pos=i;
now.time=;
qe.push(now);
}
G[x][y]=;//归0
tm[x][y]=;//开始时间初始为0
}
while(!qe.empty())
{
now=qe.front();
qe.pop();
int xx=now.x+NT[now.pos][];
int yy=now.y+NT[now.pos][];
if(xx>&&xx<=n&&yy>&&yy<=m)
{
if(now.time+==tm[xx][yy]) continue;//处理同一秒多个水滴进入同一个格子
else if(G[xx][yy])
{
G[xx][yy]++;
if(G[xx][yy]>L)
{
for(int i=;i<;i++)
{
to.x=xx;
to.y=yy;
to.pos=i;
to.time=now.time+;
qe.push(to);
}
G[xx][yy]=;
tm[xx][yy]=now.time+;//记录时间
}
}
else//该位置没水滴会向更远处传递
{
to.x=xx;
to.y=yy;
to.pos=now.pos;
to.time=now.time+;//记录时间
qe.push(to);
}
}
}
} int main()
{
#ifdef DEBUG
freopen("sample.txt","r",stdin);
#endif scanf("%d %d %d",&n,&m,&L);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
scanf("%d",&G[i][j]);
}
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
memset(tm,-,sizeof(tm));
int x,y;
scanf("%d %d",&x,&y);
BFS(x,y);
}
int sum=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
sum+=G[i][j];
}
if(sum)
{
printf("NO\n");
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
printf(j==m?"%d\n":"%d ",G[i][j]);
}
}
else printf("YES\n"); return ;
}

-

打水滴(BFS)的更多相关文章

  1. hiho 1613 - 墨水滴 - bfs+优先队列 *

    题目链接 小Ho有一张白纸,上面有NxN个格子.小Ho可以选择一个格子(X, Y),在上面滴一滴墨水.如果这滴墨水的颜色深度是G,那么这个格子也会被染成深度为G的格子.同时周围的格子也会被这滴墨水浸染 ...

  2. [Offer收割]编程练习赛32

    气泡图 两两判断关系,dfs. #include<stdio.h> #include<string.h> #include<stdlib.h> #include&l ...

  3. HDU 5336——XYZ and Drops——————【广搜BFS】

    XYZ and Drops Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  4. Hdu 5336 XYZ and Drops (bfs 模拟)

    题目链接: Hdu 5336 XYZ and Drops 题目描述: 有一个n*m的格子矩阵,在一些小格子里面可能会有一些水珠,每个小水珠都有一个size.现在呢,游戏开始咯,在一个指定的空的小格子里 ...

  5. 【bfs基础】①

    bfs,即广度优先搜索,主要通过队列(queue)进行操作. 稍微解释一下,队列是一种基础数据结构,其形态类似于一支长长的队伍,大概如下: 在C++中,队列的头文件定义为:#include<qu ...

  6. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  7. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  8. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  9. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

随机推荐

  1. Sublime Text3 python自动补全问题——Sublime Text3安装Anaconda插件

    学习python的时候 在编辑器的选择上会有很多选择,我最终还是选择了sublime text3. 相对于其他编辑器,sublime text有以下特性: 插件多,类似GoSublime,Emmet信 ...

  2. Flask—路由的注册方法

    第一种注册方法 from flask import Flask app = Flask(__name__) @app.route("/hello") # 第一种注册方法 def h ...

  3. U盘安装Debian KDE 输入法 Manjaro Linux WPS 字体

    Manjaro: 首先下载Manjaro Linux,然后用USBWriter(https://pan.baidu.com/s/1bZGb5k)写入,重启选择USB启动. 更改软件仓库(Debian称 ...

  4. 吴裕雄--天生自然C++语言学习笔记:C++ 多态

    多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态. C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数. 下面的实例中,基类 Sh ...

  5. 使用packstack安装pike版本的openstack

    最近由于工作需要,需要调研安装pike版本的gnocchi.由于ceilometer与gnocchi版本的强相关性,所以需要部署一个同一版本的openstack环境,在同事的推荐下使用了packsta ...

  6. Egret - EUI - 隐藏滚动条

    <e:Skin> <e:VScrollBar autoVisibility="false" visible="false"/> < ...

  7. App_显示图表内容

    今天在之前记账本的基础上增加了图标的显示功能,在本次课程中它以折线图为例讲述.但是课程中给出了多有图的代码案例. https://github.com/lecho/hellocharts-androi ...

  8. 关于RxJS 处理多个Http请求 串行与并行方法

    mergeMap mergeMap 操作符用于从内部的 Observable 对象中获取值,然后返回给父级流对象. 合并 Observable 对象 123456 import { of } from ...

  9. python里的反射(自学习)

    在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用一个特殊的方法或机制要访问和操作这个未 ...

  10. Flink集群模式部署及案例执行

    一.软件要求 Flink在所有类UNIX的环境[例如linux,mac os x和cygwin]上运行,并期望集群由一个 主节点和一个或多个工作节点组成.在开始设置系统之前,确保在每个节点上都安装了一 ...