Block Breaker

Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0

Problem Description
Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m square blocks of size 1×1. Due to the friction with the frame and each other, the blocks are stable and will not drop.

However, the blocks can be knocked down. When a block is knocked down, other remaining blocks may also drop since the friction provided by other remaining blocks may not sustain them anymore. Formally, a block will drop if it is knocked or not stable, which means that at least one of the left block and the right block has been dropped and at least one of the front block and the back block has been dropped. Especially, the frame can be regarded as a huge stable block, which means that if one block's left is the frame, only when its right block has been dropped and at least one of the front block and the back block has been dropped can it drop. The rest situations are similar.

Now you, the block breaker, want to knock down the blocks. Formally, you will do it q times. In each time, you may choose a position (xi,yi). If there remains a block at the chosen position, you will knock it down; otherwise, nothing will happen. Moreover, after knocking down the block, you will wait until no unstable blocks are going to drop and then do the next operation.

For example, please look at the following illustration, the frame is of size 2×2 and the block (1,1) and (1,2) have been dropped. If we are going to knock the block (2,2), not only itself but also the block (2,1) will drop in this knocking operation.

You want to know how many blocks will drop in total in each knocking operation. Specifically, if nothing happens in one operation, the answer should be regarded as 0.

 
Input
The first line contains one positive integer T (1≤T≤10), denoting the number of test cases.

For each test case:

The first line contains three positive integers n,m and q (1≤n,m≤2000,1≤q≤100000), denoting the sizes in two dimensions of the frame and the number of knocking operations.

Each of the following q lines contains two positive integers xi and yi (1≤xi≤n,1≤yi≤m), describing a knocking operation.

 
Output
For each test case, output q lines, each of which contains a non-negative integer, denoting the number of dropped blocks in the corresponding knocking operation.
 
Sample Input
2
2 2 3
1 1
1 2
2 2
4 4 6
1 1
1 2
2 1
2 2
4 4
3 3
 
Sample Output
1
1
2
1
1
2
0
1
11

题意:

有n*m个块装在一个框内,以左上角为原点,竖直向下为x正半轴,水平向右为y正半轴建立坐标系,快和块之间和块和框架之间会有摩擦力,一个块如果上下或左右有方块或框架,则他们之间可以被固定住,否则就会落下
有q次操作,每次操作会将(x,y)位置的块敲掉,问每次操作最多能掉下多少方块,如果操作的位置没有方块则输出0

思路:

可以模拟,用dfs或bfs都行,这里选择dfs,从操作位置开始搜索,如果搜索超出了边界或搜到了空位置就返回,否则就把当前位置置为空且答案+1,
从当前位置向周围检查,如果超出边界就跳过(因为我把框架也当成方块,但这个方块必须被固定而不能落下,所以检查到边界时跳过)否则如果检查到的方块不为空且他上下没有对应方块且左右没有对应方块就搜索这个检查到的位置

 #include<bits/stdc++.h>
using namespace std;
const int amn=2e3+;
int n,m,q,ans,dx,dy,td[][]={{,},{-,},{,},{,-}};
bool idx[amn][amn];
bool jg(int x,int y){
return idx[x-][y]&&idx[x+][y]||idx[x][y-]&&idx[x][y+]; ///如果上下有对应方块或左右有对应方块则返回1,否则返回0
}
void dfs(int x,int y){
if(!idx[x][y]||x<||x>n||y<||y>m)return ;
idx[x][y]=;
ans++;
// cout<<x<<' '<<y<<endl;
for(int i=;i<;i++){
dx=x+td[i][];
dy=y+td[i][];
if(dx<||dx>n||dy<||dy>m)continue;
if(!jg(dx,dy)&&idx[dx][dy]){
dfs(dx,dy);
}
}
}
int main(){
int T,xi,yi;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n+;i++) ///把边界也处理为方块,不过边界方块是固定的不能掉落
for(int j=;j<=m+;j++)
idx[i][j]=;
while(q--){
scanf("%d%d",&xi,&yi);
ans=;
dfs(xi,yi);
printf("%d\n",ans);
}
}
}
/**
有n*m个块装在一个框内,以左上角为原点,竖直向下为x正半轴,水平向右为y正半轴建立坐标系,快和块之间和块和框架之间会有摩擦力,一个块如果上下或左右有方块或框架,则他们之间可以被固定住,否则就会落下
有q次操作,每次操作会将(x,y)位置的块敲掉,问每次操作最多能掉下多少方块,如果操作的位置没有方块则输出0
可以模拟,用dfs或bfs都行,这里选择dfs,从操作位置开始搜索,如果搜索超出了边界或搜到了空位置就返回,否则就把当前位置置为空且答案+1,
从当前位置向周围检查,如果超出边界就跳过(因为我把框架也当成方块,但这个方块必须被固定而不能落下,所以检查到边界时跳过)否则如果检查到的方块不为空且他上下没有对应方块且左右没有对应方块就搜索这个检查到的位置
**/

[dfs] HDU 2019 Multi-University Training Contest 10 - Block Breaker的更多相关文章

  1. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  2. [二分,multiset] 2019 Multi-University Training Contest 10 Welcome Party

    Welcome Party Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  3. 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple

    CRB and Apple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  4. 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  5. 2015 Multi-University Training Contest 10(9/11)

    2015 Multi-University Training Contest 10 5406 CRB and Apple 1.排序之后费用流 spfa用stack才能过 //#pragma GCC o ...

  6. 2016 Multi-University Training Contest 10

    solved 7/11 2016 Multi-University Training Contest 10 题解链接 分类讨论 1001 Median(BH) 题意: 有长度为n排好序的序列,给两段子 ...

  7. 2019 Multi-University Training Contest 10 I Block Breaker

    Problem Description Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m squ ...

  8. 2019 Multi-University Training Contest 10

    目录 Contest Info Solutions C - Valentine's Day D - Play Games with Rounddog E - Welcome Party G - Clo ...

  9. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. jsde与gulp使用说明

    jade是一款基于haml的html模板引擎,已改为pug 1.全局安装 npm install jade -g 新建一个jade文件夹,再建一个后缀名为.jade的文件编辑.jade文件 jade ...

  2. “一亿”的教训:一次Google信箱诈骗是如何得手的?

    网络诈骗是指以非法占有为目的,利用互联网采用虚构事实或者隐瞒真相的方法,骗取数额较大的公私财物的行为.一年比一年网络诈骗越来越高手段,可以说是日益猖獗.在这里提醒一次各位朋友一定要注意自己的网络安全. ...

  3. C++中cin的输入分隔符问题及相关

    1.C/C++中的类型转换函数(区分类中的类型转换构造函数): 头文件:C中stdlib.h C++中cstdlib atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将 ...

  4. CSS盒子模型以及外边框合并的问题

    盒子模型 我们把布局里面的所有东西都可以想象成一个盒子,盒子里面又装着小盒子,小盒子里面又装着小小盒子......所以布局的万物基于盒子.即使一个小小的元素p,也可以把它抽象成为一个盒子.你现在心里有 ...

  5. 如何使用API提交转码任务?

    摘要: 当常规的转码工作流无法满足用户的场景时,需用户自己判断业务逻辑,并使用API提交转码任务.例如:并不是所有的视频都需要转码,不同视频需要设置不同的转码配置.本文将介绍API提交转码任务的方法. ...

  6. python——字符串截取

    str = ‘0123456789’ print str[0:3] #截取第一位到第三位的字符 print str[:] #截取字符串的全部字符 print str[6:] #截取第七个字符到结尾 p ...

  7. swoole 异步非堵塞 server/端 client/端 代码,已经测试完毕。贴代码

    服务器环境  centos7.0  swoole4.3 php7.2 pcre4.8  nginx1.8   php-fpm server.php <?php class Server { pr ...

  8. GPS信号模拟器信号发生器应用介绍

    GPS信号模拟器信号发生器应用介绍 随着近些年的科学技术不断发展,卫星导航技术也在日益发展和成熟,并在不同领域得到广泛的应用.尤其在导航定位接收机的研制测试阶段,就需要GPS信号模拟器来模拟不同环境和 ...

  9. WEB渗透 - SQL注入(持续更新)

    SQL注入 按变量类型分:数字型和字符型 按HTTP提交方式分:POST注入.GET注入和Cookie注入 按注入方式分:布尔注入.联合注入.多语句注入.报错注入.延时注入.内联注入 按数据库类型分: ...

  10. Ansible-免密登录与主机清单Inventory

    Ansible的指定用户与密码登录.免密登录.指定ssh端口以及主机清单Inventory配置 在实际使用中并不需要对ansible配置进行修改,或者说只有需要的时候才修改ansible配置. 添加用 ...