結果

問題 No.1427 Simplified Tetris
ユーザー vjudge1
提出日時 2025-06-22 11:55:11
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,589 bytes
コンパイル時間 792 ms
コンパイル使用メモリ 73,104 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-06-22 11:55:20
合計ジャッジ時間 8,093 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 4
other WA * 37
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    int H, W, N;
    cin >> H >> W >> N;
    vector<string> grid(H);
    for (int i = 0; i < H; ++i) {
        string line;
        cin >> line;
        grid[i] = line;
    }
    vector<int> positions(N);
    for (int i = 0; i < N; ++i) {
        cin >> positions[i];
    }

    vector<string> blocks(N, "........."); // 3x3 blocks initialized to all '.'

    for (int i = N - 1; i >= 0; --i) {
        int c = positions[i];
        bool found = false;
        // Try to find the highest possible position where the block could have landed
        for (int r = 0; r < H - 2; ++r) {
            // Check if the 3x3 block starting at (r, c) can be a valid block
            bool can_remove = true;
            for (int dr = 0; dr < 3; ++dr) {
                for (int dc = 0; dc < 3; ++dc) {
                    if (grid[r + dr][c + dc] == '.' && blocks[i][dr * 3 + dc] == '#') {
                        can_remove = false;
                        break;
                    }
                }
                if (!can_remove) break;
            }
            if (can_remove) {
                // Check if the block has at least one '#'
                bool has_block = false;
                for (int dr = 0; dr < 3; ++dr) {
                    for (int dc = 0; dc < 3; ++dc) {
                        if (grid[r + dr][c + dc] == '#') {
                            has_block = true;
                            break;
                        }
                    }
                    if (has_block) break;
                }
                if (!has_block) continue;
                // Now, try to determine the block's shape
                string block(9, '.');
                for (int dr = 0; dr < 3; ++dr) {
                    for (int dc = 0; dc < 3; ++dc) {
                        if (grid[r + dr][c + dc] == '#') {
                            block[dr * 3 + dc] = '#';
                            grid[r + dr][c + dc] = '.';
                        }
                    }
                }
                blocks[i] = block;
                found = true;
                break;
            }
        }
        if (!found) {
            // Handle cases where no block is found (shouldn't happen per problem statement)
            blocks[i] = "###......"; // Placeholder, though problem says input is valid
        }
    }

    for (const string &block : blocks) {
        for (int i = 0; i < 3; ++i) {
            cout << block.substr(i * 3, 3) << endl;
        }
    }

    return 0;
}
0