#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;
}
按著滑鼠往上滑就有答案