公式

F - シューティングゲーム / Gun Shooting 解説 by KoD


マス \((r, c)\) を撃ったとき、マス \((r-1, c)\) がブロックマスならばそのマスは落下します。すなわち、マス \((r, c)\)\((r-1, c)\) が入れ替わります。

落下は連鎖的に起こる可能性があるので、次はマス \((r-2, c)\) が落下するかどうか調べる必要があります。マス \((r-2, c)\) が落下するならば、次はマス \((r-3, c)\) を調べます。これを続けていくと、いつかは空マスに辿り着き、マス目の変化が終了します。

これは while 文を用いて実装すると簡潔です。

実装例 (C++) :

#include <bits/stdc++.h>
using namespace std;

int main() {
    int h, w;
    cin >> h >> w;
    vector grid(h, vector(w, 0));
    for (auto& v : grid) {
        for (auto& x : v) {
            cin >> x;
        }
    }
    int n;
    cin >> n;
    while (n--) {
        int r, c;
        cin >> r >> c;
        r -= 1, c -= 1;
        grid[r][c] = 0;
        while (r > 0 and grid[r - 1][c] > 0) {
            swap(grid[r][c], grid[r - 1][c]);
            r -= 1;
        }
    }
    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            cout << grid[i][j] << " \n"[j + 1 == w];
        }
    }
    return 0;
}

投稿日時:
最終更新: