QOJ.ac

QOJ

Time Limit: 0.5 s Memory Limit: 1024 MB Total points: 100

#15469. Magic Door

統計

通往宝藏洞穴的魔法门是一个 $m \times n$ 的网格,其中填充了各种宝石。宝石分为三类:各种颜色和形状的普通宝石,以及两种特殊类型——炸弹宝石和振金宝石。

“三消组”是指三个或更多个相同的普通宝石在垂直或水平方向上连续排列的组合。单个宝石可以同时属于水平三消组和垂直三消组(在它们相交的位置)。炸弹宝石不会形成三消组。振金宝石也不会。

在网格的初始状态下,不存在任何三消组。当你最初用手触碰两个普通宝石时,它们会交换位置。这次交换会引发连锁反应,导致宝石根据一套特定规则从网格中消失。

初始交换后,以下过程会不断重复,直到网格不再发生任何变化:

  • 阶段 1:三消组连锁反应

    1. 所有属于三消组的宝石同时消失。
    2. 消失宝石上方的所有类型的宝石由于重力向下掉落,填补空位。在此过程中,任何向下移动至少一格的炸弹宝石都会被激活。
    3. 如果宝石掉落后形成了新的三消组,则从该阶段的第一步开始重复。
    4. 如果没有形成新的三消组,则进入阶段 2。
  • 阶段 2:已激活炸弹引爆

    1. 所有当前处于激活状态的炸弹同时爆炸。
    2. 每个爆炸的炸弹会向水平和垂直方向发射光束。
    3. 光束从炸弹位置传播到网格边缘。
    4. 如果光束击中振金宝石,其路径会被阻挡。
    5. 光束路径上的所有普通宝石和炸弹会与爆炸的炸弹一起消失。
    6. 被光束击中的未爆炸炸弹会直接消失,而不会引爆。
    7. 消失宝石上方的宝石由于重力向下掉落,填补新产生的空位。在此过程中,任何向下移动至少一格的炸弹都会被激活。随后重复阶段 1。

一旦阶段 1 和阶段 2 不再引起任何变化,整个过程终止。请注意,炸弹宝石和振金宝石不会被选作初始交换的对象,也不会形成三消组。还要注意,振金宝石永远不会消失,它充当阻挡炸弹光束的屏障,且受重力影响,会掉落到下方的空位中。

例如,考虑一个由 $6 \times 4$ 网格组成的魔法门,如图 1 所示。图中,0 代表炸弹宝石,-1 代表振金宝石,正数代表普通宝石。从图 (a) 所示的初始状态开始,交换位于 $(6, 1)$ 和 $(5, 4)$ 的两个宝石,得到状态 (b)。位置 $(r, c)$ 表示从顶部起第 $r$ 行、从左侧起第 $c$ 列的单元格。坐标从 1 开始计数。该状态包含一个由三个 2 组成的三消组。根据阶段 1,当该组宝石消失后,达到状态 (c)。此时,位于 $(4, 3)$ 的炸弹宝石被激活,并形成了一个由三个 1 组成的新三消组。同样,阶段 1 移除了这三个 1,得到状态 (d)。由于没有剩余的三消组,炸弹在阶段 2 中爆炸。这导致了状态 (e)。在此处,形成了两个分别由三个 1 和四个 3 组成的三消组。同样,当这些宝石在阶段 1 中消失后,达到状态 (f)。该状态不再发生进一步变化,成为最终状态。在此过程中总共有 18 个宝石消失。

图 1. 连锁反应

当特定数量的宝石消失时,魔法门就会打开。你的任务是编写一个程序,给定魔法门的信息以及要交换的两个普通宝石的位置,计算在单次交换引发的整个连锁反应完全停止后,消失的宝石总数。

输入格式

程序从标准输入读取数据。输入的第一行包含两个整数 $m$ 和 $n$ ($3 \le m \le 80$; $3 \le n \le 80$),表示网格的行数和列数。接下来的 $m$ 行每行包含 $n$ 个整数,表示网格中每一行的宝石,其中 0 代表炸弹宝石,-1 代表振金宝石,1 到 9 之间的整数代表普通宝石。最后一行包含四个整数 $r_1, c_1, r_2, c_2$ ($1 \le r_1, r_2 \le m$; $1 \le c_1, c_2 \le n$),其中 $(r_1, c_1)$ 和 $(r_2, c_2)$ 表示要交换的两个不同普通宝石的坐标。坐标从 1 开始计数。

输出格式

程序输出到标准输出。仅打印一行,包含一个整数,表示所有过程完成后消失的宝石总数。

样例

样例输入 1

6 4
1 1 2 2
3 2 -1 1
3 1 0 2
1 1 3 1
3 2 2 3
2 1 2 1
6 1 5 4

样例输出 1

18

样例输入 2

4 5
0 2 1 2 2
0 1 2 2 0
1 1 2 1 0
2 -1 -1 -1 2
3 3 3 4

样例输出 2

15

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.