QOJ.ac

QOJ

Süre Sınırı: 0.5 s Bellek Sınırı: 1024 MB Toplam puan: 100

#15469. 魔法の扉

İstatistikler

宝の洞窟への魔法の扉は、さまざまな宝石で埋められた $m\times n$ の格子です。宝石は三つの種類に分かれます。さまざまな色や形の通常の宝石と、二つの特別な種類である爆弾の宝石、ビブラニウムの宝石です。

problem_15469_b9b73e6bad8d1df16c283e61ebf3041d.png

3個以上の一致グループとは、同じ通常の宝石が縦または横に3個以上連続して並んだグループです。一つの宝石が、横のグループと縦のグループの交差点で両方に属することもあります。爆弾の宝石は一致グループを作りません。ビブラニウムの宝石も同様です。

格子の初期状態には一致グループはありません。最初に二つの通常の宝石に手で触れると、それらの位置が入れ替わります。この1回の交換が連鎖反応を引き起こし、特定の規則に従って格子から宝石が消えます。

最初の交換の後、格子が変化しなくなるまで次の過程を繰り返します。

段階1: 一致グループの連鎖反応

  1. すべての一致グループに属する宝石が同時に消えます。

  2. 消えた宝石の上にあるすべての種類の宝石が、重力で下に落ちて空きマスを埋めます。このとき、1マス以上下がった爆弾の宝石は起動状態になります。

  3. 落下後に新しい一致グループができた場合、この段階の最初の手順から繰り返します。

  4. これ以上一致グループができなければ、段階2に進みます。

段階2: 起動した爆弾の爆発

  1. 現在起動状態にあるすべての爆弾が同時に爆発します。

  2. 各爆弾は、爆発すると横方向と縦方向に光線を放ちます。

  3. 光線は爆弾の位置から格子の端まで進みます。

  4. 光線はビブラニウムの宝石に当たると遮られます。

  5. 光線の経路にあるすべての通常の宝石と爆弾が、爆発した爆弾とともに消えます。

  6. 光線に当たった未爆発の爆弾は、爆発せずにそのまま消えます。

  7. 消えた宝石の上の宝石が、重力で下に落ち、新たな空きマスを埋めます。このとき1マス以上下がった爆弾は起動状態になります。その後、段階1を繰り返します。

段階1と段階2による変化がなくなれば、過程全体が終了します。爆弾とビブラニウムの宝石は最初の交換の対象に選ばれず、一致グループも作りません。また、ビブラニウムの宝石は決して消えず、爆弾の光線を遮る壁になります。ただし重力の影響を受け、その下の空きマスに落ちます。

例えば、図1のような $6\times4$ の格子でできた魔法の扉を考えます。図では $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個の宝石が消えます。

problem_15469_ff3006d93a9d0c7094f27b98426f2e1d.png

図1. 連鎖反応

特定の数の宝石が消えると、魔法の扉が開きます。あなたの課題は、魔法の扉の情報と交換する二つの通常の宝石の位置が与えられたとき、1回の交換で始まった連鎖反応全体が完全に止まった後に、消えた宝石の個数を計算するプログラムを書くことです。

入力

プログラムは標準入力から読み取ります。最初の行には格子の行数と列数を表す2整数 $m,n$ ($3\le m\le80$; $3\le n\le80$) が含まれます。続く $m$行には各行 $n$個の整数が含まれ、その行の宝石を表します。$0$は爆弾、$-1$はビブラニウム、$1$以上 $9$以下の整数は通常の宝石を表します。最後の行には4整数 $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行を出力してください。その行には、すべての処理が終了した後に消える宝石の総数を表す整数が含まれる必要があります。

次に、二つのテストケースの入力例と出力例を示します。(入力例1は図1(a)に対応します。)

入出力例

入力 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.