#55147: cpp_answer


yp11451202@yphs.tp.edu.tw (705-38黃鈺潤)


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>

using namespace std;

int M = 0, N = 0;
vector<vector<char>> grid;

// 四個方向的移動向量 (上下左右),用於 Flood Fill
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

// Flood Fill 實作 (使用 BFS 避免遞迴過深導致 Stack Overflow)
void flood_fill(int startX, int startY, char newColor) {
    char oldColor = grid[startY][startX];
    if (oldColor == newColor) return; // 顏色相同不需處理
    
    queue<pair<int, int>> q;
    q.push({startX, startY});
    grid[startY][startX] = newColor;
    
    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();
        
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            
            // 檢查是否在畫布邊界內,且顏色與舊顏色相同
            if (nx >= 1 && nx <= M && ny >= 1 && ny <= N) {
                if (grid[ny][nx] == oldColor) {
                    grid[ny][nx] = newColor;
                    q.push({nx, ny});
                }
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    char cmd;
    while (cin >> cmd && cmd != 'X') {
        if (cmd == 'I') {
            cin >> M >> N;
            // 題目座標從 1 開始,所以開 (N+1) x (M+1) 的空間
            grid.assign(N + 1, vector<char>(M + 1, 'O'));
        }
        else if (cmd == 'C') {
            for (int i = 1; i <= N; i++) {
                fill(grid[i].begin(), grid[i].end(), 'O');
            }
        }
        else if (cmd == 'L') {
            int x, y;
            char c;
            cin >> x >> y >> c;
            if (x >= 1 && x <= M && y >= 1 && y <= N) grid[y][x] = c;
        }
        else if (cmd == 'V') {
            int x, y1, y2;
            char c;
            cin >> x >> y1 >> y2 >> c;
            if (y1 > y2) swap(y1, y2); // 確保 y1 是較小值
            for (int y = y1; y <= y2; y++) {
                if (x >= 1 && x <= M && y >= 1 && y <= N) grid[y][x] = c;
            }
        }
        else if (cmd == 'H') {
            int x1, x2, y;
            char c;
            cin >> x1 >> x2 >> y >> c;
            if (x1 > x2) swap(x1, x2); // 確保 x1 是較小值
            for (int x = x1; x <= x2; x++) {
                if (x >= 1 && x <= M && y >= 1 && y <= N) grid[y][x] = c;
            }
        }
        else if (cmd == 'K') {
            int x1, y1, x2, y2;
            char c;
            cin >> x1 >> y1 >> x2 >> y2 >> c;
            if (x1 > x2) swap(x1, x2);
            if (y1 > y2) swap(y1, y2);
            for (int y = y1; y <= y2; y++) {
                for (int x = x1; x <= x2; x++) {
                    if (x >= 1 && x <= M && y >= 1 && y <= N) grid[y][x] = c;
                }
            }
        }
        else if (cmd == 'F') {
            int x, y;
            char c;
            cin >> x >> y >> c;
            if (x >= 1 && x <= M && y >= 1 && y <= N) {
                flood_fill(x, y, c);
            }
        }
        else if (cmd == 'S') {
            string name;
            cin >> name;
            cout << name << "\n";
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= M; j++) {
                    cout << grid[i][j];
                }
                cout << "\n";
            }
        }
        else {
            // 其餘無效指令,讀取掉該行剩下的文字
            string dummy;
            getline(cin, dummy);
        }
    }
    
    return 0;
}

按著滑鼠往上滑就有答案