# 題目: UVa 10267 - Graphical Editor
# 題目說明
你需要實做一個編輯圖像的程式
INPUT:
共有9種指令
I M N: 生成一個N * M大小的圖,所有字元預設為O(大寫O)C: 清除圖,將所有字元設為OL X Y C: 將圖的(X, Y)設為CV X Y1 Y2 C: 畫垂直線(X, Y1)至(X, Y2)H X1 X2 Y C: 畫水平線(X1, Y)至(X2, Y)K X1 Y1 X2 Y2 C: 畫矩形(X1, Y1)至(X2, Y2)F X Y C: 填滿顏色,將(X, Y)與之相鄰的同色填為CS Name: 寫入檔案名稱,並印出X: 結束程式
OUTPUT:
輸出當前的檔案名稱及圖
# 解題方法
針對每個指令做出相對應動作
比較需要注意的是指令F需要用dfs填色
# 參考程式碼
#include <iostream>
#include <string>
#include <memory.h>
using namespace std;
char G[251][251];
int M = 0, N = 0;
void dfs(int x, int y, char now, char c)
{
if (y < 1 || y > N || x < 1 || x > M || G[y][x] != now) return;
G[y][x] = c;
dfs(x + 1, y, now, c);
dfs(x - 1, y, now, c);
dfs(x, y + 1, now, c);
dfs(x, y - 1, now, c);
}
int main()
{
// fast io
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
char cmd, C, Now;
int x1, x2, y1, y2;
string Name, str;
memset(G, 'O', sizeof(G));
while (cin >> cmd, cmd != 'X')
{
switch (cmd)
{
case 'I':
cin >> M >> N;
memset(G, 'O', sizeof(G));
break;
case 'C':
memset(G, 'O', sizeof(G));
break;
case 'L':
cin >> x1 >> y1 >> C;
G[y1][x1] = C;
break;
case 'V':
cin >> x1 >> y1 >> y2 >> C;
if (y1 > y2) swap(y1, y2);
for (int i = y1; i <= y2; ++i) G[i][x1] = C;
break;
case 'H':
cin >> x1 >> x2 >> y1 >> C;
if (x1 > x2) swap(x1, x2);
for (int i = x1; i <= x2; ++i) G[y1][i] = C;
break;
case 'K':
cin >> x1 >> y1 >> x2 >> y2 >> C;
if (y1 > y2) swap(y1, y2);
if (x1 > x2) swap(x1, x2);
for (int i = y1; i <= y2; ++i)
for (int j = x1; j <= x2; ++j) G[i][j] = C;
break;
case 'F':
cin >> x1 >> y1 >> C;
if (G[y1][x1] != C) dfs(x1, y1, G[y1][x1], C);
break;
case 'S':
cin >> Name;
cout << Name << "\n";
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= M; ++j) cout << G[i][j];
cout << "\n";
}
break;
default:
cin.ignore();
getline(cin, str);
break;
}
}
return 0;
}